Golangでのstructのmixinの方法です。
package main
import (
"fmt"
)
type Widget struct {
name string
}
type WidgetMap map[string]string
type WrappedWidget struct {
Widget
WidgetMap
}
func main() {
widget := Widget{"my widget"}
widgetMap := map[string]string{"key1": "value1", "key2": "value2"}
wrappedWidget := WrappedWidget{Widget: widget, WidgetMap: widgetMap}
fmt.Printf("%#v\n", wrappedWidget)
fmt.Println(wrappedWidget.name) // アクセス出来る。
fmt.Println(wrappedWidget.Widget.name) // こちらもアクセス出来る。
// for _, v := range wrappedWidget { // これはエラー
for _, v := range wrappedWidget.WidgetMap { // これはOK
fmt.Println(v)
}
}
$ go run main.go
main.WrappedWidget{Widget:(*main.Widget)(0xc000010200), WidgetMap:main.WidgetMap{"key1":"value1", "key2":"value2"}}
my widget
my widget
value1
value2
structのフィールドに、別のstructを名前無し(匿名)で設定すると、promoted fieldとなり、上記コードで言うと wrappedWidget.name でアクセス出来ます。
また、匿名で設定したフィールドの名前は、設定したstructと同じものになるため、上記で言うと wrappedWidget.Widget.name でそのままダイレクトにアクセスも可能です。
mapをmixinして、forループのrangeで回す場合、 range wrappedWidget ではできず、 range wrappedWidget.WidgetMap のように、一旦ダイレクトアクセスが必要です。
詳しくは、下記です。