Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用的Go包中的全局变量_Go - Fatal编程技术网

调用的Go包中的全局变量

调用的Go包中的全局变量,go,Go,我感兴趣的是使用一个使用全局变量的Go包,对于我的应用程序来说,它是一个关键的“变量”。每次调用这个包时,我都要设置那个变量(它被导出)。我从各种围棋套路中称之为围棋。是否有一个推荐的策略来排序/同步我对该包的调用,以便我的代码不会与该全局变量冲突 下面是一个例子: package main import ( "fmt" "sync" "time" "github.com/jameshaskell/_sketches/globalvars/testlib" )

我感兴趣的是使用一个使用全局变量的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()
}
注意:我希望使用的包(具有全局变量)不是我的…

使用带有
值的包
类型

您可以使用该包,但请注意警告:

这些功能需要非常小心才能正确使用。除了 特殊的、低级的应用程序,最好使用 同步包的频道或设施。通过共享内存 沟通;不要通过共享内存进行交流

或者您可以使用sync.Mutex来保护变量,但这需要将其包装在结构或访问函数中以正确控制访问


还有一个更广泛的问题,您应该尝试回答——如果您每次访问包时都设置这个变量,为什么它是包变量?为什么不把它传递给需要它的函数呢?因为它每次都会改变,所以包变量中除了它带来的同步问题之外,没有什么意义

该变量是否打算以这种方式使用?可能有一些特定的setter/getter?文档中是否有有关的信息

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

所以我更喜欢:

  • 在官方文件中阅读

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

  • 准备测试以覆盖变量的不同情况

  • 运行竞赛条件检测器作为我的CI测试的一部分


  • 你能更具体地回答你的问题吗?示例代码将有助于说明你在做什么。我想使用的软件包是:“github.com/jinchu/now”。我想在每次调用包时设置全局变量“now.TimeFormats”。或者我只是在试图不恰当和/或危险地使用这个软件包?我可以使用sync.Mutex将访问权包装到我自己的受保护结构和方法中。。。够好吗?谢谢。肯定会运行种族检测器。我正在重新考虑使用这个软件包。。。
    package testlib
    
    import "fmt"
    
    var GlobalVar int
    
    func TestFunc() string {
        return fmt.Sprintf("GlobalVar: %d\n", GlobalVar)
    }