埋め込みを他のパッケージから隠蔽する #golang

August 8, 2014

この記事はQiitaの記事をエクスポートしたものです。内容が古くなっている可能性があります。

以下の記事にも書いているが,構造体型へ別の型を匿名フィールドとして埋め込む場合,型がパッケージ外に公開してあると,パッケージ外からその匿名フィールドにアクセスできてしまう.

たとえば,以下のように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)}
}