我是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():
new()
func (m *SyncMap) Init() { m.hm = make(map[string]string) m.lock = new(sync.RWMutex) }
但是我想知道,是否有可能摆脱这种样板初始化?
您只需要一个构造函数。常用的模式是
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 }