>백엔드 개발 >Golang >`json.Unmarshal`이 참조에서는 작동하지만 포인터에서는 작동하지 않는 이유는 무엇입니까?

`json.Unmarshal`이 참조에서는 작동하지만 포인터에서는 작동하지 않는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-12 04:57:01513검색

Why Does `json.Unmarshal` Work with a Reference but Not a Pointer?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.