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

我是Golang的新手,所以这个configuration让我疯狂:

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") 

在这一刻,我得到一个零指针恐慌。

我已经通过使用另一个函数,并在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 } 

“Mue”的解决scheme由于互斥体未初始化而不起作用。 以下修改工作:

 package main import "sync" type SyncMap struct { lock *sync.RWMutex hm map[string]string } func NewSyncMap() *SyncMap { return &SyncMap{lock: new(sync.RWMutex), hm: make(map[string]string)} } func (m *SyncMap) Put (k, v string) { m.lock.Lock() defer m.lock.Unlock() m.hm[k] = v } func main() { sm := NewSyncMap() sm.Put("Test", "Test") } 

http://play.golang.org/p/n-jQKWtEy5

被deamon抓住了 Mue可能会考虑将locking为一个值而不是一个指针的更常见的模式。 由于互斥锁的零值是一个随时可用的解锁互斥量,因此不需要初始化,并且包含一个值作为常见值。 作为进一步简化,您可以通过省略字段名称来embedded它。 你的结构然后获取互斥体的方法集。 看到这个工作的例子, http://play.golang.org/p/faO9six-Qx 。 我也拿出延期的使用。 在某种程度上,这是一个偏好和编码风格的问题,但由于它有一个小的开销,我倾向于不使用它在小function,特别是如果没有条件代码。