以下の記事にも書いているが,構造体型へ別の型を匿名フィールドとして埋め込む場合,型がパッケージ外に公開してあると,パッケージ外からその匿名フィールドにアクセスできてしまう.
たとえば,以下のようにHoge
型に*Fuga
型を埋め込んだ場合,Fuga
型はパッケージ外に公開されているため,埋め込んだFuga
型の値にもアクセスできてしまう.
type Fuga struct {
}
type Hoge struct {
*Fuga
}
// パッケージ外からもアクセスできる
hoge := &Hoge{&Fuga{}}
hoge.Fuga = nil
また,パッケージ外に公開されていない型を埋め込んだ場合は,パッケージ外からアクセスできない.
type fuga struct {
}
type Hoge struct {
*fuga
}
func NewHoge() *Hoge {
return &Hoge{&fuga{}}
}
// パッケージ外からはアクセスできない
hoge := pkg.NewHoge()
hoge.fuga = nil
そこで,公開されている型を埋め込みたい場合は,以下のようにtype
で新しく公開されない型を作ってやればよい.
type Fuga struct {
}
type fuga Fuga
type Hoge struct {
*fuga
}
func NewHoge() *Hoge {
return &Hoge{&fuga{}}
}
もちろん,埋め込む型が構造体型じゃなくても問題ない.
type stringer fmt.Stringer
type Hoge struct {
stringer
}
func NewHoge(s fmt.Stringer) *Hoge {
return &Hoge{stringer(s)}
}