douwei8911 2010-12-21 11:58
浏览 62
已采纳

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

I am new to Golang so allocation in it makes me insane:

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
}

and later, I just call:

sm := new(SyncMap)
sm.Put("Test, "Test")

At this moment I get a nil pointer panic.

I've worked around it by using another one function, and calling it right after new():

func (m *SyncMap) Init() {
        m.hm = make(map[string]string)
        m.lock = new(sync.RWMutex)
}

But I wonder, if it's possible to get rid of this boilerplate initializing?

  • 写回答

3条回答 默认 最新

  • dst2007 2010-12-21 12:45
    关注

    You just need a constructor. A common used pattern is

    func NewSyncMap() *SyncMap {
        return &SyncMap{hm: make(map[string]string)}
    }
    

    In case of more fields inside your struct, starting a goroutine as backend, or registering a finalizer everything could be done in this constructor.

    func NewSyncMap() *SyncMap {
        sm := SyncMap{
            hm: make(map[string]string),
            foo: "Bar",
        }
    
        runtime.SetFinalizer(sm, (*SyncMap).stop)
    
        go sm.backend()
    
        return &sm
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • ¥15 Python报错怎么解决
  • ¥15 simulink如何调用DLL文件
  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离
  • ¥30 线性代数的问题,我真的忘了线代的知识了
  • ¥15 有谁能够把华为matebook e 高通骁龙850刷成安卓系统,或者安装安卓系统