我仍然不是Golang的Maven,我试图理解和学习最佳实践。
如何初始化包中的单例并使其线程安全,因此即使包在不同文件中多次导入,也只有一个示例
现在示例sessions
在主进程中初始化了,但之后我必须传递它。如何在包sess
中初始化示例sessions
,使其成为包中的全局变量或其他变量?
我希望它是sess
包中的私有变量
package main
func main(){
sessions := sess.Init()
}
sess
模块
package sess
import (
"sync"
"time"
)
type pool struct {
lock sync.RWMutex
sessions map[string]*session
}
func Init() *pool {
p := &pool{
sessions: map[string]*session{},
}
return p
}
func (p *pool) Set(sid string, s *session){
p.lock.Lock()
defer p.lock.Unlock()
p.sessions[sid] = s
}
func (p *pool) Get(sid string) (*session, bool){
p.lock.RLock()
defer p.lock.RUnlock()
s, ok := p.sessions[sid]
return s, ok
}
4条答案
按热度按时间3wabscal1#
使用单例声明并初始化导出的包级变量。每个包级变量都有一个初始化的示例,而不是每个导入都有一个示例或初始化。
vhmi4jdf2#
如果其他包依赖于
pool
,你可以直接注入它。例如(Go playground link):rbl8hiat3#
您可以使用
sync.Once
类型来确保这一点。sync。Once是一个只执行一个操作的对象。这里是一个link到操场
h79rfbju4#
首先,你可能不想要一个单例,更有可能的是,你想创建一个结构体,然后传递它沿着或者更好地传递一个表示你想要的行为的接口。也就是说,您可以使用
init()
函数来初始化单例