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 のように、一旦ダイレクトアクセスが必要です。

詳しくは、下記です。

广告
将在 10 秒后关闭
bannerAds