Dlaczego json.Unmarshal działa z odwołaniem, ale nie ze wskaźnikiem?
Ten przykład zjson.Unmarshal docs (nieco zmodyfikowany dla uproszczenia obsługiAnimal
zamiast[]Animal
) działa, bez błędów:
Link do zabaw na przykład pracy
// ...
var animals Animal
err := json.Unmarshal(jsonBlob, &animals)
// ...
Ale ten nieco zmodyfikowany przykład nie:
Link do placu zabaw w niepracującym przykładzie
// ...
var animals *Animal
err := json.Unmarshal(jsonBlob, animals)
// ...
Wyświetla ten niejasny błąd, który naprawdę nie jest pomocny (wygląda bardziej jak wywołanie funkcji niż błąd IMO):
json: Unmarshal (zero * main.Animal)
Wydaje się, że tak jestanimals
jest niezainicjowanym wskaźnikiem. Ale doktorzy mówią (podkreślenie moje):
Nieostrożny unormowuje JSON do wartości wskazywanej przez wskaźnik.Jeśli wskaźnik jest zerowy, Unmarshal przydziela mu nową wartość, na którą ma wskazywać.
Dlaczego więc unmarshaling zawodzi w drugim przykładzie i pokazuje ten niejasny błąd?
(Czy jest to „unmarshalling” lub „unmarshaling” (jeden L)? Dokumenty używają obu).