我是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
}
Run Code Online (Sandbox Code Playgroud)
后来,我打电话给:
sm := new(SyncMap)
sm.Put("Test, "Test")
Run Code Online (Sandbox Code Playgroud)
这时我得到一个零指针恐慌.
我通过使用另一个函数解决了它,并在之后调用它new():
func (m *SyncMap) Init() {
m.hm = make(map[string]string)
m.lock = new(sync.RWMutex)
}
Run Code Online (Sandbox Code Playgroud)
但我想知道,如果有可能摆脱这个样板初始化?
the*_*mue 66
你只需要一个构造函数.常用的模式是
func NewSyncMap() *SyncMap {
return &SyncMap{hm: make(map[string]string)}
}
Run Code Online (Sandbox Code Playgroud)
如果你的结构中有更多的字段,启动goroutine作为后端,或者注册一个终结器,一切都可以在这个构造函数中完成.
func NewSyncMap() *SyncMap {
sm := SyncMap{
hm: make(map[string]string),
foo: "Bar",
}
runtime.SetFinalizer(sm, (*SyncMap).stop)
go sm.backend()
return &sm
}
Run Code Online (Sandbox Code Playgroud)
'Mue'的解决方案不起作用,因为互斥锁未初始化.以下修改有效:
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")
}
Run Code Online (Sandbox Code Playgroud)
http://play.golang.org/p/n-jQKWtEy5
deamon很好的捕获.Mue可能正在考虑将锁定为值而不是指针的更常见模式.由于Mutex的零值是即用型未锁定互斥锁,因此它不需要初始化,并且包含一个值,因为值很常见.作为进一步的简化,您可以通过省略字段名称来嵌入它.然后,您的结构获取Mutex的方法集.请参阅此工作示例,http://play.golang.org/p/faO9six-Qx.我也拿出了推迟使用.在某种程度上,这是一个偏好和编码风格的问题,但由于它确实有一个小的开销,我倾向于不在小函数中使用它,特别是如果没有条件代码.
| 归档时间: |
|
| 查看次数: |
59418 次 |
| 最近记录: |