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