我是 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")
此时我得到一个零指针 panic 。
我已经通过使用另一个函数来解决它,并在 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
}
关于new-operator - 如何在 Go 结构中初始化成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4498998/