json.Unmarshal を使用して JSON データをアンマーシャリングする場合、予期しない変換を避けるために宛先変数に具体的な型を指定することが重要です。
提供されたコードで、以下を含むインターフェイスを返す関数 getFoo() を定義します。 Foo 構造体。このインターフェイスを json.Unmarshal に送信すると、値が具体的な構造体ではなくマップとして解釈されます。
この問題に対処するには、インターフェイス内で具体的な構造体へのポインタを渡すか、 json.Unmarshal.
で直接具体的な構造体型を使用する例を次に示します。 pointer:
func getFoo() interface{} { return &Foo{"bar"} } func main() { fooInterface := getFoo() jsonBytes := []byte(`{"bar":"This is the new value of bar"}`) err := json.Unmarshal(jsonBytes, fooInterface) if err != nil { fmt.Println(err) } fmt.Println(fooInterface) // *main.Foo &{Bar:This is the new value of bar} }
または、型アサーションを使用して具象型を指定できます。
func main() { fooInterface := getFoo() jsonBytes := []byte(`{"bar":"This is the new value of bar"}`) foo := fooInterface.(*Foo) err := json.Unmarshal(jsonBytes, foo) if err != nil { fmt.Println(err) } fmt.Println(foo) // &{Bar:This is the new value of bar} }
ポインターまたは型アサーションのいずれかを介して具象型を指定すると、次のことが保証されます。 json.Unmarshal は、型情報とフィールド値を保持しながら、データを目的の構造体に直接アンマーシャルします。
以上が構造体の代わりにインターフェースを使用すると「json.Unmarshal」が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。