2017-07-26 2 views
0

Gibt es neben dem Kopieren des inneren Box Wert von Hand eine Sprachfunktion, RatedBox in eine Box down -cast?downcast höher-typ auf niedriger

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

Mögliches Duplikat von [Golang: Ist eine Konvertierung zwischen verschiedenen Strukturtypen möglich?] (Https://stackoverflow.com/questions/24613271/golang -is-conversion-zwischen-verschiedenen-struct-types-möglich) –

+1

Kannst du nicht benutzen. Kasten: = rated.Box ?? –

+0

Auch bezogen werden: https://stackoverflow.com/a/37725577/19020 –

Antwort

5

Embedding ein Typ in einer Struktur fügt ein Feld auf die Struktur, und Sie können die uneingeschränkten Typnamen darauf zu verweisen verwenden (unqualifizierte Mittel auslassen die Paketnamen und die optionalen Zeigerzeichen).

Zum Beispiel:

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

Output (versuchen Sie es auf dem Go Playground):

main.Box {Name:foo} 

Beachten Sie, dass assignment kopiert den Wert, so dass die box lokale Variable wird eine Kopie des Wertes halten das Feld RatedBox.Box. Wenn man sie zu den „gleichen“ (Punkt auf den gleichen Wert Box) möchten, verwenden Sie einen Zeiger, z.B .:

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

Aber hier natürlich Art von box wird *Box sein.

Oder Sie können wählen, um den Zeiger Typ einzubetten:

type RatedBox struct { 
    *Box 
    Points int 
} 

Und dann (versuchen Sie es auf dem Go Playground):

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

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

Ausgang der letzten 2:

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

Go ist nicht in der gleichen Art und Weise C objektorientiert ++ oder Java ist. Für Fälle, in denen Sie Polymorphie benötigen, sollten Sie Schnittstellen verwenden. Diese Antwort ist das Beste, was Sie ohne sie tun können. –

Verwandte Themen