全局变量private to file

时间:2017-07-22 11:18:47

标签: go global-variables

在GOLANG中,有没有办法让变量的范围在包中的文件本地? 就我而言,有两个文件ex1.go和ex02.go. ex01.go定义了一个全局变量

var wg sync.WaitGroup

用于该文件中的各个函数。

在另一个文件ex02.go(与ex01.go无关,除了ex01.go和ex02.go属于同一类问题 - 即并发),我无法定义变量waitGroup as

var wg sync.WaitGroup

我收到错误 - "变量名称在此块中重新声明"

有没有办法让变量名称不会溢出到其他文件?

3 个答案:

答案 0 :(得分:15)

出于变量作用域的目的,文件在Go中没有意义。将包中的所有文件想象为它们将被连接起来,这些(简化)正是在编译之前发生的事情。

这意味着:不,没有办法将变量作用于文件。

如果您需要两个全局WaitGroup,则需要将它们定义为单个变量。

答案 1 :(得分:5)

只有显式导入的标识符才具有文件范围。在文件wg.go中说你定义

package wg
var Wg sync.WaitGroup
// and all staff common to class of problems - i.e. concurrency

然后你可以在文件ex1.go

import wg
wg.Wg.Add(1) //use locally to file
在ex2.go中也是如此

答案 2 :(得分:0)

我建议您使用以下信息并将其适当地应用于您的具体问题。以下大多数示例来自This Medium article

Go的变量声明和范围的几个特征与其他语言一致,而一些特定于Go。

更一致的特性处理块和变量声明。如果你在一个块中声明一个变量v,那么嵌套到它的每个块都可以“看到”v。如果你重新声明这些嵌套块中的一个,那么当你离开这个内部块时,你将该值丢失为a并重新获得旧值。

的示例:

func main() {
    {
        v := 1
        {
            fmt.Println(v)
        }
        fmt.Println(v)
    }
    // “undefined: v” compilation error
    // fmt.Println(v)
}

> ./bin/sandbox
1
1

在这个示例中,您可以看到变量的值是“看到”的,从其声明嵌套的范围

v := 1
{
    v = 2  // assignment
    fmt.Println(v)
}
fmt.Println(v)

>./bin/sandbox
2
2

这个例子通过说明,因为变量v在外部范围上声明,然后我也可以重新分配v的值,而不是重新声明v并使其对任何范围生效可以“看到”v := 1 { v := 2 // short variable declaration fmt.Println(v) } fmt.Println(v) >./bin/sandbox 2 1

func main()

最后一个示例更接近您原来的问题。这个显示我可以拥有相同的变量名,但具有多个变量的多个声明,具体取决于我的范围。这导致我们更加不同

更多不同的特征涉及Go的包私有和公共声明以及顶级识别的概念。

首先让我们谈谈顶级识别。顶级标识声明在任何其他类型或函数声明之外的变量,类型或函数。 // Package Public func Main(){...} var MyVar; type MyType uint64; // Package Private func main(){...} var myVar; type myType uint64; 是顶级身份识别的一个很好的例子。现在让我们考虑一下Go包中的多个文件。考虑Go包中的多个文件的一种方法是将它们全部附加在一起以形成一个非常长的文件。考虑到这一点,我们现在可以看到为什么没有文件私有变量的概念。只有包私人或包公共。

自定义包是顶级变量,仅对包本身可见,并且对可能导入此包的任何人可见。整个软件包可以导入此软件包的任何人都可以看到公开包。这仅通过名称第一个字母的大写来描述。

main()

请注意,案例确实很重要,Main()df.map 会调用同一个函数。您也可以使用它来解决您的问题,但我不建议只是为了绕过重新声明而更改大小写。