>  기사  >  백엔드 개발  >  인터페이스 작업 시 JSON Unmarshal이 Go에서 구조체 대신 맵을 반환하는 이유는 무엇입니까?

인터페이스 작업 시 JSON Unmarshal이 Go에서 구조체 대신 맵을 반환하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-10-25 09:26:02605검색

Why Does JSON Unmarshal Return a Map Instead of a Struct in Go When Working with Interfaces?

의도한 구조체 대신 맵을 반환하는 JSON 역마샬링의 미스터리

Go에서 JSON 역마샬링은 인터페이스와 구조체를 처리할 때 문제를 일으킬 수 있습니다. 개발자는 주어진 코드 조각의 경우처럼 비정렬화 프로세스가 예상된 구조체 대신 맵을 생성하는 상황에 직면할 수 있습니다.

<code class="go">import "encoding/json"
import "fmt"
import "reflect"

func main() {
    type Ping struct {
        ID int `json:"id"`
    }
    var ping interface{} = Ping{}
    if err := json.Unmarshal([]byte(`{"id":42}`), &ping); err != nil {
        panic(err)
    }
    fmt.Println("Unexpected:", ping) // Result: map[id:42]
}</code>

이 동작의 근본적인 이유는 인터페이스의 추상적인 특성에 있습니다. 인터페이스에서 JSON 역마샬링이 수행되면 결과는 기본 유형의 필드를 나타내는 맵입니다. 위의 예에서 인터페이스 Ping은 단일 키-값 쌍인 {"id":42}가 있는 맵을 보유합니다.

이 문제를 수정하고 원하는 구조체를 얻으려면 포인터를 전달하는 것이 중요합니다. 특정 구조체 유형으로:

<code class="go">type Ping struct {
    ID int `json:"id"`
}
func main() {
    var ping Ping
    if err := json.Unmarshal([]byte(`{"id":42}`), &ping); err != nil {
        panic(err)
    }
    fmt.Println("Success:", ping) // Result: {42}
}</code>

포인터를 Ping에 전달하면 JSON 역정렬 프로세스가 맵을 생성하는 대신 구조체의 인스턴스를 생성하고 해당 필드를 채우도록 지시됩니다.

또는 구체적인 구조체에 대한 포인터를 사용할 수 없는 경우 리플렉션을 사용하여 포인터를 동적으로 생성한 후 해당 값을 인터페이스에 할당할 수 있습니다.

<code class="go">import "reflect"

func main() {
    var ping interface{} = Ping{}
    nptr := reflect.New(reflect.TypeOf(ping))
    if err := json.Unmarshal([]byte(`{"id":42}`), nptr.Interface()); err != nil {
        panic(err)
    }
    ping = nptr.Elem().Interface()
    fmt.Println("Reflect-Based:", ping) // Result: {42}
}</code>

위 내용은 인터페이스 작업 시 JSON Unmarshal이 Go에서 구조체 대신 맵을 반환하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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