Go構造体のメンバーを初期化する方法 質問する

Go構造体のメンバーを初期化する方法 質問する

私は 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
}

おすすめ記事