ホームページ >バックエンド開発 >Golang >Goで異なるJSONタグを持つ構造体のスライスを変換するにはどうすればよいですか?

Goで異なるJSONタグを持つ構造体のスライスを変換するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-10-26 18:06:30801ブラウズ

How to Convert Slices of Structs with Different JSON Tags in Go?

Go における構造体のスライス間の型変換

Go では、構造体のスライス間の型変換は困難な場合があります。次のコードを考えてみましょう。

<code class="go">type Societe struct {
    Name string
}

type ListSociete []Societe

func loadListSociete(name string) (ListSociete, error) {
    res := []struct {
        Name string `json:"a.name"`
    }{}
    // ...
    return ListSociete(res), nil
}</code>

res を ListSociete に変換しようとすると、これらの型は本質的に交換可能ではないため、変換は失敗します。どちらも同様の基礎構造を共有していますが、res 内の JSON タグの存在により区別されます。

主要な区別: 構造型のタグ

Go 仕様では、次の 2 つが規定されています。フィールド、名前、型、タグの順序が同じであれば、構造体の型は同一です。 res タイプにはタグ json:"a.name" が含まれており、これにより Societe と区別されます。

変換オプション

これらのタイプ間の変換には、主に 2 つのオプションがあります。 :

  1. 反復とコピー:

    res 内の各要素を反復し、各要素から Name フィールドをコピーして新しい ListSociete を作成します。このメソッドは安全ですが、冗長で非効率的です。

    <code class="go">ls := make(ListSociete, len(res))
    for i := 0; i < len(res); i++ {
        ls[i].Name = res[i].Name
    }</code>
  2. 安全でない変換:

    共有の基礎となるデータ構造を利用して、安全でない変換を実行します。型変換。ただし、予期しないエラーが発生する可能性があるため、これはお勧めできません。

    <code class="go">return *(*ListSociete)(unsafe.Pointer(&res)), nil</code>

結論

構造体のスライス間の型変換は次のように行うことができます。反復とコピー、または安全でない変換のいずれかを使用して達成されます。どちらを選択するかは、関連する要件とリスクによって異なります。関連するタイプの違いと、変換アプローチの潜在的な結果を理解することが重要です。

以上がGoで異なるJSONタグを持つ構造体のスライスを変換するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。