2017-07-26 6 views
0

Boxの値をにダウンキャストする手作業で手書きでBoxにコピーしますか? (修飾されていない手段は、パッケージ名とオプションを省略ダウンキャストハイタイプからダウン

type Box struct { 
    Name string 
} 

type RatedBox struct { 
    Box 
    Points int 
} 

func main() { 
    rated := RatedBox{Box: Box{Name: "foo"}, Points: 10} 

    box := Box(rated) // does not work 
} 

go-playground

// works, but is quite verbose for structs with more members 
box := Box{Name: rated.Name} 
+1

を[Golang:異なる構造体タイプ間の変換は可能ですか?](https://stackoverflow.com/questions/24613271/golang) -is-conversion-between-different-struct-types-possible) –

+1

使用できません。ボックス:= rated.Box ?? –

+0

関連:https://stackoverflow.com/a/37725577/19020 –

答えて

5

Embedding構造体のタイプは、構造体にフィールドを追加し、あなたはそれを参照するために修飾されていないタイプの名前を使用することができますポインタ記号)。例えば

box := rated.Box 
fmt.Printf("%T %+v", box, box) 

出力(Go Playground上でそれを試してみてください):assignmentコピー値、そうboxローカル変数がの値のコピーを保持すること

main.Box {Name:foo} 

注意RatedBox.Boxフィールド。あなたは彼らが(同じBox値を指すように)「同じ」になりたい場合は、ポインタを使用して、例えば:

box := &rated.Box 
fmt.Printf("%T %+v", box, box) 

しかし、ここでboxのコースタイプの*Boxになります。

それとも、ポインタ型埋め込むように選択することがあります。

type RatedBox struct { 
    *Box 
    Points int 
} 

をそして(Go Playground上でそれを試してみてください):最後の2の

rated := RatedBox{Box: &Box{Name: "foo"}, Points: 10} 

box := rated.Box 
fmt.Printf("%T %+v", box, box) 

出力:

*main.Box &{Name:foo} 
+3

Goは、C++またはJavaと同じようにオブジェクト指向ではありません。多態性が必要な場合は、インターフェイスを使用する必要があります。この答えは、あなたがそれらなしで行うことができる最高です。 –

関連する問題