Краткий способ проверить структуру вложенного указателя на ноль в Go? - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть вложенная структура из JSON. Эта структура имеет много необязательных свойств, и чтобы успешно пройти ее, мне нужно проверить, существуют ли свойства. Когда свойства определяются как структуры указателей, это становится очень неудобным: мне приходится создавать экземпляр пустого типа и сравнивать его с помощью refle.DeepEqual .

Есть ли более краткий способ сделать это?

Пример:

package main

import (
    "encoding/json"
    "fmt"
    "reflect"
)

func unmarshalNested(data []byte) (nested, error) {
    var r nested
    err := json.Unmarshal(data, &r)
    return r, err
}

type nested struct {
    Alfa alfa `json:"alfa"`
}

type alfa struct {
    Bravo *bravo `json:"bravo,omitempty"`
}

type bravo struct {
    Charlie string `json:"charlie"`
}

func main() {

    json := `
{
    "alfa": {
        "bravo": {
            "charlie": "foobar"
        }
    }
}
`
    /*
        json := "{"alfa": {}}
    */

    n := nested{}
    n, _ = unmarshalNested([]byte(json))

    fmt.Println("-- Alfa --")
    fmt.Printf("  %+v\n", n)

    fmt.Println("-- *Bravo --")

    var b *bravo = nil
    if reflect.DeepEqual(b, n.Alfa.Bravo) {
        fmt.Println("  nil")
    } else {
        fmt.Printf("  %+v\n", n.Alfa.Bravo)
    }
}

1 Ответ

2 голосов
/ 18 февраля 2020

Вы можете сравнить любое значение указателя с nil, без необходимости отражения:

if n.Alpha.Bravo == nil {
    fmt.Println("  nil")
} else {
    fmt.Printf("  %+v\n", n.Alfa.Bravo)
}
...