JSON 언마샬링으로 이동: 구조체와 인터페이스 - 포인터를 언제 사용해야 할까요?

Patricia Arquette
풀어 주다: 2024-11-26 20:11:11
원래의
127명이 탐색했습니다.

Go JSON Unmarshalling: Structs vs. Interfaces – When to Use Pointers?

JSON을 구조체와 인터페이스로 역마샬링

Go에서 인코딩/json 패키지는 JSON 데이터를 Go 값으로 변환하는 기능을 제공합니다. . JSON을 구조체로 언마샬링할 때 패키지에는 대상 유형에 대한 명시적인 지침이 필요하다는 점을 이해하는 것이 중요합니다.

기본적으로 JSON을 인터페이스로 언마샬링할 때 패키지는 데이터 구조에 따라 적절한 유형을 선택합니다. JSON 객체의 경우 map[string]interface{}를 선택하고, JSON 배열의 경우 []interface{}를 선택합니다. 그러나 이 동작은 구조체를 다룰 때 다릅니다.

JSON을 특정 구조체로 역마샬링하려면 json.Unmarshal()의 두 번째 매개 변수로 구조체에 대한 포인터를 전달해야 합니다. 이는 Go가 포인터를 함수에 전달할 때 포인터를 자동으로 역참조하기 때문입니다.

그러나 JSON을 포인터가 아닌 구조체 값이 포함된 인터페이스 변수로 역마샬링하려고 시도하면 패키지는 의도한 것을 결정할 방법이 없습니다. 대상 유형. 대신 데이터를 구조에 따라 맵이나 슬라이스로 해석합니다.

이 문제를 해결하려면 포인터 참조를 사용하여 구조체 값을 인터페이스{}에 래핑해야 합니다. 이렇게 하면 json.Unmarshal이 적절한 유형으로 역마샬링하는 데 필요한 정보를 갖게 됩니다.

func getFoo() interface{} {
    return &Foo{"bar"} // Use a pointer wrapper
}
로그인 후 복사

다음은 예제 코드의 향상된 버전입니다.

package main

import (
    "encoding/json"
    "fmt"
)

type Foo struct {
    Bar string `json:"bar"`
}  

func getFoo() interface{} {
    return &Foo{"bar"}
}

func main() {

    fooInterface := getFoo() 

    myJSON := `{"bar":"This is the new value of bar"}`
    jsonBytes := []byte(myJSON)

    err := json.Unmarshal(jsonBytes, fooInterface )
    if err != nil {
        fmt.Println(err)
    }
    fmt.Printf("%T %+v", fooInterface, fooInterface) 
}
로그인 후 복사

이 업데이트된 코드는 성공적으로 인쇄됩니다. 업데이트된 "bar" 값을 가진 마샬링되지 않은 Foo 구조체.

위 내용은 JSON 언마샬링으로 이동: 구조체와 인터페이스 - 포인터를 언제 사용해야 할까요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿