Unmarshal이 참조에서는 작동하지만 포인터에서는 작동하지 않는 이유는 무엇입니까?
이 질문에 대한 컨텍스트를 제공하기 위해 Go에서는 json.Unmarshal 함수가 역직렬화됩니다. 제공된 참조가 가리키는 구조체에 JSON 데이터를 넣습니다. 두 가지 시나리오에서 Unmarshal의 동작을 살펴보겠습니다.
시나리오 1: 구조체 참조
첫 번째 시나리오에서 구조체에 대한 nil이 아닌 참조는 다음과 같습니다. 다음 스니펫과 같이 Unmarshal로 전달되었습니다.
var animals Animal err := json.Unmarshal(jsonBlob, &animals)
이는 원활하게 작동합니다. 문서에 따르면 포인터가 nil(0으로 초기화됨)인 경우 Unmarshal은 가리킬 새 구조체 값을 할당합니다. 그러나 이 경우 동물은 이미 초기화되어 유효한 구조체를 가리키고 있으므로 작업이 성공합니다.
시나리오 2: 구조체에 대한 포인터
이 시나리오에서는 , 구조체에 대한 초기화되지 않은 포인터가 Unmarshal에 전달됩니다.
var animals *Animal err := json.Unmarshal(jsonBlob, animals)
이로 인해 "잘못된 인수" 오류가 발생합니다.
json: Unmarshal(nil *main.Animal)
이는 문서가 완전히 명확하지 않기 때문에 발생합니다. Unmarshal은 포인터가 nil인 경우 새 구조체를 할당한다고 언급하지만 Unmarshal 소스 코드의 다음 주석에 표시된 대로 포인터 자체가 nil이 아니어야 한다고 명시적으로 명시하지는 않습니다.
// An InvalidUnmarshalError describes an invalid argument passed to Unmarshal. // (The argument to Unmarshal must be a non-nil pointer.)
따라서 초기화되지 않은 포인터(Go에서는 기본적으로 nil임)를 Unmarshal에 전달하면 nil이 아닌 포인터에 대한 요구 사항을 위반하므로 이 오류가 발생합니다. 이 문제를 해결하려면 Unmarshal을 호출하기 전에 포인터를 새 구조체로 초기화하면 됩니다.
"Unmarshaling"의 철자
철자에 관해서는 "unmarshalling"과 "unmarshalling" 모두 "unmarshaling"은 허용되는 철자법이며 Go 소스 코드베이스의 grep에 따르면 두 번째는 Go 코드에서 더 일반적입니다.
위 내용은 `json.Unmarshal`이 참조에서는 작동하지만 포인터에서는 작동하지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!