一尘不染

如何在Go结构中初始化成员

go

我是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)
}

但是我想知道,是否有可能摆脱这种样板初始化?


阅读 239

收藏
2020-07-02

共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
}
2020-07-02