go - Go 中的静态全局变量

标签 go

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

相关文章:

encoding - 从 io.Reader 读取 UTF-8 编码的字符串

Golang如何在将结构编码(marshal)到yaml时避免在键 "on"上双引号

go - 我们如何知道字节数组上的结构类型

rest - 如何使用 Golang 实现导入数据功能?

logging - 堆栈跟踪作为字符串

arrays - 在golang中打印slice的地址

go - 如何检查空 slice ?

windows - 无论我在我的代码上投入了多少,我都无法弄清楚如何纠正我的导入周期。 (戈朗)

go - 在 VSCode 中使用命令行参数调试 Go 测试

linux - 在我的服务器上部署和构建我的 go 应用程序