>백엔드 개발 >Golang >`json.Unmarshal`과 함께 Go의 `인터페이스{}`를 사용할 때 예기치 않은 동작을 방지하려면 어떻게 해야 합니까?

`json.Unmarshal`과 함께 Go의 `인터페이스{}`를 사용할 때 예기치 않은 동작을 방지하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-21 08:06:12992검색

How Can I Avoid Unexpected Behavior When Using Go's `interface{}` with `json.Unmarshal`?

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.Unmarshal.
  • Test 구조체에 대한 포인터를 보유하고 있으므로 json.Unmarshal은 JSON 데이터를 구조체로 올바르게 역마샬링합니다.

결론:

인터페이스{}는 어떤 ​​값이든 담을 수 있는 유형이지만 단순한 값이 아닙니다. 모든 유형에 대한 자리 표시자입니다. 예상치 못한 동작을 방지하려면 특히 JSON 작업에서 인터페이스{}를 함수 매개변수로 사용할 때 포인터를 적절하게 처리하세요.

위 내용은 `json.Unmarshal`과 함께 Go의 `인터페이스{}`를 사용할 때 예기치 않은 동작을 방지하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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