>  기사  >  백엔드 개발  >  포인터를 사용할 때 `json.Unmarshal`이 실패하지만 참조에서는 성공하는 이유는 무엇입니까?

포인터를 사용할 때 `json.Unmarshal`이 실패하지만 참조에서는 성공하는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-19 20:05:03392검색

Why Does `json.Unmarshal` Fail When Using a Pointer but Succeed with a Reference?

JSON 역마샬링: 참조와 포인터의 차이점 공개

JSON 구문 분석 영역에서 json.Unmarshal은 없어서는 안 될 도구입니다. 그러나 그 행동은 때때로 혼란스러울 수 있습니다. 특히 사용자는 참조를 사용할 때 역마샬링이 원활하게 작동하지만 포인터를 사용할 때 이상하게 실패하는 이유를 궁금해할 수 있습니다. 이 문제의 핵심을 살펴보겠습니다.

참조 대 포인터

첫 번째 예에서는 "동물"을 동물 유형 변수로 정의합니다. Unmarshal에 "&animals"를 전달할 때 이 변수에 대한 참조를 제공합니다. 이를 통해 Unmarshal이 원래 구조를 직접 조작할 수 있습니다.

반대로 두 번째 예에서는 "animals"를 Animal 유형에 대한 포인터로 선언합니다. 포인터는 변수 자체가 아닌 다른 변수의 주소를 보유합니다. "animals"를 Unmarshal에 직접 전달한다는 것은 초기화되지 않았기 때문에 nil 포인터를 전달한다는 의미입니다.

The Paradox

이상하게도 Unmarshal 문서에는 다음과 같이 명시되어 있습니다. 포인터가 nil인 경우 포인터에 새 값을 할당할 수 있습니다. 그렇다면 두 번째 예는 왜 실패합니까?

오류 공개

두 번째 예의 오류 메시지는 실제로 InvalidUnmarshalError입니다. 이 오류는 Unmarshal에 전달된 인수가 잘못된 포인터인 경우 발생합니다. 문서의 설명에도 불구하고 Unmarshal에는 nil이 아닌 포인터가 인수로 필요합니다.

요점

포인터를 사용하여 JSON을 적절하게 역마샬링하려면 이를 초기화해야 합니다. 첫 번째. 문서에서 알 수 있듯이 Unmarshal을 호출하기 전에 포인터에 유효한 값을 할당하면 됩니다.

Unmarshalling과 Unmarshaling

게다가 눈치채셨을 수도 있습니다. 문서에서는 "언마샬링"과 "언마샬링"을 모두 사용합니다. 두 철자가 모두 올바른 것으로 간주되지만 Go 커뮤니티에서는 "역마샬링"이 더 일반적이고 선호되는 사용법입니다.

위 내용은 포인터를 사용할 때 `json.Unmarshal`이 실패하지만 참조에서는 성공하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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