はじめに
Goの構造体で明示的に指定しなくてもメソッドもしくはフィールドにアクセスできる方法を記しています。
ようするに埋め込みです。
Embedding言葉を知らない人でもHitするようなタイトルにしてます。
フィールド名もしくはメソッド名は同じでない場合は明示的に指定しなくてよい
逆に同じ名前があるなら明示的にしてければならない
main.go
type Hoge struct {
Aaa string
Bbb string
Ccc string
}
func(h *Hoge) Get() string {
return "fuga"
}
func(h *Hoge) GetHoge() string {
return "get hoge"
}
type Fuga struct {
Aaa string
Bbb string
Ddd string
}
func(f *Fuga) Get() string {
return "fuga"
}
func(f *Fuga) GetFuga() string {
return "get fuga"
}
type HogeFuga struct {
Hoge
Fuga
}
func main() {
hoge := Hoge{
Aaa: "hoge",
Bbb: "hogehoge",
Ccc: "hogehogehoge",
}
fuga := Fuga{
Aaa: "fuga",
Bbb: "fugafuga",
Ddd: "fugafugafuga",
}
hogefuga := HogeFuga{
Hoge: hoge,
Fuga: fuga,
}
//- フィールド名
fmt.Println(hogefuga.Aaa) //- エラーが発生 フィールド名が一緒なので
fmt.Println(hogefuga.Bbb) //- エラーが発生 フィールド名が一緒なので
fmt.Println(hogefuga.Ccc) //- hogehogehoge
fmt.Println(hogefuga.Ddd) //- fugafugafuga
fmt.Println(hogefuga.Hoge.Aaa) //- hoge
fmt.Println(hogefuga.Hoge.Bbb) //- hogehoge
fmt.Println(hogefuga.Hoge.Ccc) //- hogehogehoge
fmt.Println(hogefuga.Fuga.Aaa) //- fuga
fmt.Println(hogefuga.Fuga.Bbb) //- fugafuga
fmt.Println(hogefuga.Fuga.Ddd) //- fugafugafuga
//- メソッド名
fmt.Println(hogefuga.Get()) //- エラーが発生 メソッド名が一緒なので
fmt.Println(hogefuga.GetHoge()) //- get hoge
fmt.Println(hogefuga.GetFuga()) //- get fuga
fmt.Println(hogefuga.Hoge.Get()) //- hoge
fmt.Println(hogefuga.Fuga.Get()) //- fuga
fmt.Println(hogefuga.Hoge.GetHoge()) //- get hoge
fmt.Println(hogefuga.Fuga.GetFuga()) //- get fuga
}
まとめ
埋め込みをする場合はフィールド名とメソッド名が同じでも問題ないが
呼び出すときに同じ命名は明示的に指定して呼び出すこと