Por que o json.Unmarshal trabalha com referência, mas não ponteiro?
Este exemplo dojson.Unmarshal docs (ligeiramente modificados para simplificar o usoAnimal
ao invés de[]Animal
) funciona, sem erros:
Link Playground de exemplo de trabalho
// ...
var animals Animal
err := json.Unmarshal(jsonBlob, &animals)
// ...
Mas este exemplo ligeiramente modificado não:
Link Playground de exemplo não funcional
// ...
var animals *Animal
err := json.Unmarshal(jsonBlob, animals)
// ...
Ele exibe esse erro obscuro que realmente não é útil (parece mais com uma chamada de função do que com um erro IMO):
json: Unmarshal (nil * main.Animal)
Isso parece ser porqueanimals
é um ponteiro não inicializado. Mas os docs dizem (ênfase minha):
Unmarshal unmarshals o JSON no valor apontado pelo ponteiro.Se o ponteiro for nulo, o Unmarshal aloca um novo valor para o qual ele aponta.
Então, por que o unmarshaling falha no segundo exemplo e mostra esse erro obscuro?
(Além disso, é "unmarshalling" ou "unmarshaling" (um L)? Os documentos usam ambos.)