Golang 인터페이스{} 유형 오해
인터페이스{} 유형을 함수 매개변수로 사용할 때 개발자는 예상치 못한 동작에 직면하는 경우가 많습니다. 특히 다음과 같은 경우에는 더욱 그렇습니다. json.Unmarshal을 통해 JSON 데이터와 상호 작용합니다.
문제:
Go에서 인터페이스{}는 모든 값과 유형을 보유할 수 있는 유형입니다. 하지만 흔히 무형식 컨테이너로 오해되기도 합니다. 이러한 오해는 다음과 같은 상황에서 발생합니다.
func test(i interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, &i) fmt.Println(i) } func main() { test(Test{}) }
예상 동작:
이 코드는 JSON 데이터를 Test 구조체로 역마샬링하려고 시도합니다. 그러나 이로 인해 구조체가 map[string]interface{} 유형으로 예기치 않게 변환됩니다.
설명:
json.Unmarshal은 JSON을 포인터가 아닌 값. i는 테스트 구조체를 보유하는{} 인터페이스이므로 수정을 허용하기 위해 주소(&i)로 전달됩니다. 그러나 json.Unmarshal은 인터페이스{} 포인터를 Test 구조체가 포함된 인터페이스{} 값에 대한 포인터로 간주합니다. 비포인터로 역마샬링할 수 없으며, 기본값은 역마샬링된 JSON에 대해 새 map[string]interface{} 값을 생성하는 것입니다.
올바른 접근 방식:
이 오해를 해결하려면 다음을 고려하십시오. 시나리오:
func test(i *interface{}) { j := []byte(`{ "foo": "bar" }`) json.Unmarshal(j, i) fmt.Println(*i) } func main() { var i *Test test(&i) }
설명:
결론:
인터페이스{}는 어떤 값이든 담을 수 있는 유형이지만 단순한 값이 아닙니다. 모든 유형에 대한 자리 표시자입니다. 예상치 못한 동작을 방지하려면 특히 JSON 작업에서 인터페이스{}를 함수 매개변수로 사용할 때 포인터를 적절하게 처리하세요.
위 내용은 `json.Unmarshal`과 함께 Go의 `인터페이스{}`를 사용할 때 예기치 않은 동작을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!