私は Golang の初心者なので、Golang での割り当ては私を狂わせます:
import "sync"
type SyncMap struct {
lock *sync.RWMutex
hm map[string]string
}
func (m *SyncMap) Put (k, v string) {
m.lock.Lock()
defer m.lock.Unlock()
m.hm[k] = v, true
}
そして後で、私は次のように呼び出します:
sm := new(SyncMap)
sm.Put("Test, "Test")
この時点で、nil ポインタ パニックが発生します。
私は別の関数を使用して、それを直後に呼び出すことでこれを回避しましたnew()
:
func (m *SyncMap) Init() {
m.hm = make(map[string]string)
m.lock = new(sync.RWMutex)
}
しかし、この定型的な初期化を取り除くことは可能でしょうか?
ベストアンサー1
必要なのはコンストラクタだけです。よく使われるパターンは
func NewSyncMap() *SyncMap {
return &SyncMap{hm: make(map[string]string)}
}
構造体内にさらにフィールドがある場合、バックエンドとして goroutine を開始する場合、またはファイナライザーを登録する場合、すべてをこのコンストラクターで実行できます。
func NewSyncMap() *SyncMap {
sm := SyncMap{
hm: make(map[string]string),
foo: "Bar",
}
runtime.SetFinalizer(sm, (*SyncMap).stop)
go sm.backend()
return &sm
}