의도한 구조체 대신 맵을 반환하는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!