>백엔드 개발 >Golang >Go의 `interface{}` 유형에서 `json.Unmarshal`이 실패하는 이유는 무엇입니까?

Go의 `interface{}` 유형에서 `json.Unmarshal`이 실패하는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-04 14:24:12894검색

Why Does `json.Unmarshal` Fail with Go's `interface{}` Type?

Golang 인터페이스{} 유형 오해

Go에서 인터페이스{} 유형을 사용하면 변수가 모든 유형의 값을 보유할 수 있습니다. 그러나 인터페이스{}를 함수 매개변수 유형으로 사용하면 json.Unmarshal로 작업할 때 예상치 못한 결과가 발생할 수 있습니다.

시나리오 1: Unmarshal을 사용한 비포인터 유형

포인터가 아닌 유형을 인터페이스{} 유형의 함수 매개변수에 전달할 때 json.Unmarshal은 값으로 역마샬링할 수 없습니다. 대신, 새로운 map[string]interface{} 값을 생성하고 이를 인터페이스{}에 저장합니다. 이는 json.Unmarshal에 역마샬링을 위한 포인터가 필요하기 때문입니다.

시나리오 2: Unmarshal을 사용한 포인터 유형

대신 값에 대한 포인터가 전달되는 경우 json. 비정렬화는 예상대로 작동하고 데이터를 지정된 값으로 비정렬화합니다. 이는 포인터를 사용하면 json 패키지가 기본 값을 수정할 수 있기 때문입니다.

시나리오 3: 잘못된 포인터 사용

포인터 유형을 사용하는 경우에도 json.Unmarshal에 전달하는 동안(즉, &&i 사용) 주소를 사용하면 예기치 않은 동작이 발생할 수 있습니다. 이 경우 json.Unmarshal은 포인터를 역참조하고 포인터가 아닌 인터페이스{} 값을 찾아 새 map[string]interface{} 값을 생성합니다.

설명

인터페이스{}는 단순히 유형이 없는 컨테이너가 아니라 그 자체로 유형입니다. 값과 해당 유형을 래핑합니다. 인터페이스{}에 대한 포인터를 전달하면 다른 패키지가 기본 값을 수정할 수 있지만, 인터페이스{} 값을 직접 전달하면 수정이 방지됩니다.

모범 사례

혼란을 방지하려면 , 인터페이스에 대한 포인터보다는 인터페이스 내의 값에 대한 포인터를 사용하는 것이 좋습니다. 이 접근 방식을 사용하면 json 패키지가 데이터를 원하는 유형으로 올바르게 역정렬화할 수 있습니다.

위 내용은 Go의 `interface{}` 유형에서 `json.Unmarshal`이 실패하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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