Golang インターフェース{} タイプの誤解
インターフェース{} タイプを関数パラメータとして使用する場合、開発者は、特に次の場合に予期しない動作に遭遇することがよくあります。 json.Unmarshal を介して JSON データを操作します。
問題:
Go では、interface{} は任意の値と型を保持できる型です。ただし、これは型のないコンテナーであるとよく誤解されます。この誤解は、次のような状況で発生します。
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 は Test 構造体を保持するインターフェースであるため、変更を許可するためにアドレス (&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) }
説明:
結論:
interface{} は任意の値を保持できる型ですが、単なる任意の型のプレースホルダー。予期しない動作を回避するには、interface{} を関数パラメータとして使用するとき、特に JSON 操作でポインタを適切に処理してください。
以上がGo の「interface{}」を「json.Unmarshal」で使用するときの予期せぬ動作を回避するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。