我是 Go 语言的新手,我需要一些帮助。我已经声明了一个全局变量,但问题是它没有保留它的值。它可以用一个静态变量来解决,但 Go 中不存在这样的变量。我该如何解决?
gID
是一个全局变量。这个函数被调用了两次。在第一次调用时,if
代码被执行。第二,执行 else
代码。我想要第二个结构 Learner
实例,以获取第一个 Learner 的实例 ID。
我不得不提一下,NewLearner 被来自不同包的两个不同文件调用了两次。
func NewLearner(name string, peerURLs types.URLs, clusterName string, now *time.Time) *Learner {
l := &Learner{
RaftAttributes: RaftAttributes{PeerURLs: peerURLs.StringSlice()},
Attributes: Attributes{Name: name},
}
var b []byte
sort.Strings(l.PeerURLs)
for _, p := range l.PeerURLs {
b = append(b, []byte(p)...)
}
b = append(b, []byte(clusterName)...)
if now != nil {
b = append(b, []byte(fmt.Sprintf("%d", now.Unix()))...)
hash := sha1.Sum(b)
l.ID = types.ID(binary.BigEndian.Uint64(hash[:8]))
gID=l.ID
return l
} else {
l.ID = gID
return l
}
}
最佳答案
包变量不保持其值的事实可能是由并发引起的。 我会那样解决你的问题。使用带有互斥锁的包变量,以防函数被并发调用。
import "sync"
var(
gID uint64
muID sync.Mutex
)
func myfunc(param bool) {
var id uint64
if param {
id = newID()
muID.Lock()
gID = id
muID.Unlock()
} else {
muID.Lock()
id = gID
muID.Unlock()
}
}
关于go - Go 中的静态全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48172952/