go - 被调用的 Go 包中的全局变量

标签 go

我有兴趣使用一个使用全局变量的 Go 包,对于我的应用程序来说,它是一个关键的“变量”。每次调用这个包时,我都想设置该变量(它已导出)。我从各种 Go 例程中调用它。是否有推荐的策略来排序/同步对该包的调用,以便我的代码不会与该全局变量发生冲突?

这是一个例子:

package main

import (
    "fmt"
    "sync"
    "time"

    "github.com/jameshaskell/_sketches/globalvars/testlib"
)

var wg sync.WaitGroup

func gr(i int) {
    defer wg.Done()
    testlib.GlobalVar = i
    duration := time.Duration(i) * time.Millisecond
    time.Sleep(duration)
    fmt.Printf("   pause %d DONE\n", i)
    fmt.Printf("      global var: %d should be: %d  TestFunc: %s\n", testlib.GlobalVar, i, testlib.TestFunc())
}

func main() {
    for i := 0; i <= 10; i += 1 {
        wg.Add(1)
        go gr(i)
    }
    wg.Wait()
}

我尝试访问的包如下:

package testlib

import "fmt"

var GlobalVar int

func TestFunc() string {
    return fmt.Sprintf("GlobalVar: %d\n", GlobalVar)
}

注意:我希望使用的包(具有全局变量)不是我的......

最佳答案

这个变量是打算这样使用的吗?可能有一些特定的 setter / getter 吗?文档有相关信息吗?

我认为代码变得非常脆弱,因为您无法控制对变量的所有访问。您可以使用互斥体序列化代码中的访问。但另一个库的代码不知道你的。此外,它可能会在新版本或错误修复中突然发生变化。

所以我更喜欢:

  1. 在官方文档中阅读相关内容

  2. 如果文档允许,并且我无法避免使用它,请根据任务使用sync/mutex/atomic/channel 保护对变量的访问。

  3. 准备测试以涵盖变量的不同情况

  4. 运行竞争条件检测器作为我的 CI 测试的一部分。

关于go - 被调用的 Go 包中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47126587/

相关文章:

go - 如何测试 http.Redirect 使用正确的重定向 URI?

Go:JSON 编码错误

soap - 如何在 Go 中进行 SOAP 调用?

postgresql - 节省时间。golang 中的时间到带有时区字段的 postgres 时间戳

go - 创建具有类型接口(interface)的映射以通过 URL 参数接受任意数据类型

xml - 使用 golang 编码/xml 解码 GML 时出错

mongodb - Go mgo 不存储对象

azure - Azure Web App 上的自定义 golang 启动命令

go - 流式命令从 Goroutine 输出进度

oop - Golang,调用 parent 的方法