web-dev-qa-db-ja.com

Golang:異なる構造タイプ間の変換は可能ですか?

このように設定された2つの類似したタイプがあるとします。

type type1 []struct {
    Field1 string
    Field2 int
}
type type2 []struct {
    Field1 string
    Field2 int
}

Type1からtype2に値を書き込む直接的な方法はありますか? (ソースからターゲットにすべてのフィールドをコピーするループを書く以外)

ありがとう。

45

特定の例では、簡単に変換できます playground

t1 := type1{{"A", 1}, {"B", 2}}
t2 := type2(t1)
fmt.Println(t2)
35
OneOfOne

OneOfOneの回答を参照するには、仕様の Conversions セクションを参照してください。

それは

非定数値xは、次のいずれの場合でもT型に変換できます。

  • xTに割り当て可能です。
  • xの型とTの基礎となる型は同じです。
  • xの型とTは名前のないポインター型であり、それらのポインターベース型は同じ基になる型を持っています。
  • xの型とTは両方とも整数型または浮動小数点型です。
  • xの型とTは両方とも複合型です。
  • xは整数またはバイトまたはルーンのスライスであり、Tは文字列型です。
  • xは文字列で、Tはバイトまたはルーンのスライスです。

最初の強調表示されたケースはあなたのケースです。両方のタイプには基礎となるタイプがあります

[]struct { Field1 string Field2 int }

基になる型は次のように定義されます

Tが事前宣言されたブール型、数値型、文字列型、または型リテラルのいずれかである場合、対応する基になる型はT自体です。それ以外の場合、Tの基になる型は、Tが型宣言で参照する型の基になる型です。 (仕様、 タイプ

型リテラルを使用して型を定義しているため、この型リテラルは基になる型です。

47
nemo

Go 1.8以降、ある構造体タイプから別の構造体タイプに値を変換する場合、構造体タグは無視されます。タイプtype1とtype2は、そのGoリリースでは、structタグに関係なく変換可能です。 https://beta.golang.org/doc/go1.8#language

13
Ludi Rehak

ニコラス、後のコメントで、構造体でフィールドタグを使用していると言いました。これらは定義の一部としてカウントされるため、以下で定義されるt1とt2は異なり、t2(t1)をキャストできません。

type t1 struct {
    Field1 string
}

type t2 struct {
    Field1 string `json:"field_1"`
}

[〜#〜] update [〜#〜]:これは、Go 1.8以降では当てはまりません

11
m.kocikowski

タイプt1の各要素をタイプt2にマップするマッパー関数を手動で使用できます。それが動作します。

func GetT2FromT1(ob1 *t1) *t2 {
     ob2 := &t2 { Field1: t1.Field1, }
     return ob2
}
2
Agniswar Bakshi