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).

questionAnswers(4)

yourAnswerToTheQuestion