ホームページ > バックエンド開発 > Golang > 構造体の代わりにインターフェースを使用すると「json.Unmarshal」が失敗するのはなぜですか?

構造体の代わりにインターフェースを使用すると「json.Unmarshal」が失敗するのはなぜですか?

Patricia Arquette
リリース: 2024-11-26 04:26:12
オリジナル
444 人が閲覧しました

Why Does `json.Unmarshal` Fail When Using Interfaces Instead of Structs?

インターフェイスではなく構造体への JSON のアンマーシャリング

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート