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

标签 new-operator go

我是 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/

相关文章:

c++ - 了解新运营商

google-app-engine - 去数据存储查询获取单个实体?

Golang 使用 DYNAMIC 键解析 json

go - 如何在函数中修改 GORM DB 指针?

go - 如何在Golang中的struct中访问嵌套字段

javascript - 如何检测后退按钮和新窗口?

c++ - 根据 valgrind,malloc 和 new 在整体成本中占有巨大份额。我怎样才能减少它?

android - 是否可以在 android 的同一个选项卡中打开新的 Intent ?

JavaScript:好的部分——如何完全不使用 `new`

go - sync.WaitGroup 是 Barrier 的一个实现吗?