Waka blog.

[Go]型埋め込みの問題点を意識する

そもそも型埋め込みとは..

以下のように構造体の中に別の構造体を埋め込むこと。

type Base struct {
    ID   int
    Name string
}

func (b Base) GetName() string {
    return b.Name
}

type User struct {
    Base      // 型埋め込み
    Email string
}

以下のように、User構造体のインスタンスからBase構造体の中身を直接使用できる。これを プロモートする と呼ぶ

user := User()
user.ID
// user.Base.ID と書かなくても良い

問題点

隠蔽したい場合でも全て外部に公開されてしまう

以下のように実装することで、InMemのレシーバから直接LockやUnLockにアクセスしてGetメソッドを実装できる

type InMem struct {
	sync.Mutex // <- 埋め込みフィールド
	m map[string]int
}

func New() *InMem {
	retur &InMem{m: make(map[string]int }
}

func (i *InMenu) Get(key string) (int, bool) {
	i.Lock() // <- MutexのLockメソッドに直接アクセス
	v, contains := i.m[key]
	i.Unlock() // <- Unlockも
	return v, contains
}

しかしこれは誤り、MutexのLock, Unlockは本来隠蔽されているべきもの。

こうした意図しないメソッドの公開を意識する必要がある。