このように設定された2つの類似したタイプがあるとします。
type type1 []struct {
Field1 string
Field2 int
}
type type2 []struct {
Field1 string
Field2 int
}
Type1からtype2に値を書き込む直接的な方法はありますか? (ソースからターゲットにすべてのフィールドをコピーするループを書く以外)
ありがとう。
特定の例では、簡単に変換できます playground :
t1 := type1{{"A", 1}, {"B", 2}}
t2 := type2(t1)
fmt.Println(t2)
OneOfOneの回答を参照するには、仕様の Conversions セクションを参照してください。
それは
非定数値
x
は、次のいずれの場合でもT
型に変換できます。
x
はT
に割り当て可能です。x
の型とT
の基礎となる型は同じです。x
の型とT
は名前のないポインター型であり、それらのポインターベース型は同じ基になる型を持っています。x
の型とT
は両方とも整数型または浮動小数点型です。x
の型とT
は両方とも複合型です。x
は整数またはバイトまたはルーンのスライスであり、T
は文字列型です。x
は文字列で、T
はバイトまたはルーンのスライスです。
最初の強調表示されたケースはあなたのケースです。両方のタイプには基礎となるタイプがあります
[]struct { Field1 string Field2 int }
基になる型は次のように定義されます
T
が事前宣言されたブール型、数値型、文字列型、または型リテラルのいずれかである場合、対応する基になる型はT
自体です。それ以外の場合、T
の基になる型は、T
が型宣言で参照する型の基になる型です。 (仕様、 タイプ )
型リテラルを使用して型を定義しているため、この型リテラルは基になる型です。
Go 1.8以降、ある構造体タイプから別の構造体タイプに値を変換する場合、構造体タグは無視されます。タイプtype1とtype2は、そのGoリリースでは、structタグに関係なく変換可能です。 https://beta.golang.org/doc/go1.8#language
ニコラス、後のコメントで、構造体でフィールドタグを使用していると言いました。これらは定義の一部としてカウントされるため、以下で定義されるt1とt2は異なり、t2(t1)をキャストできません。
type t1 struct {
Field1 string
}
type t2 struct {
Field1 string `json:"field_1"`
}
[〜#〜] update [〜#〜]:これは、Go 1.8以降では当てはまりません
タイプt1の各要素をタイプt2にマップするマッパー関数を手動で使用できます。それが動作します。
func GetT2FromT1(ob1 *t1) *t2 {
ob2 := &t2 { Field1: t1.Field1, }
return ob2
}