首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >文件私有的全局变量

文件私有的全局变量
EN

Stack Overflow用户
提问于 2017-07-22 19:18:47
回答 3查看 16.4K关注 0票数 21

在GOLANG中,有没有一种方法可以使变量的作用域成为包中文件的局部作用域?在我的例子中,有两个文件ex1.go和ex02.go。ex01.go定义一个全局变量

代码语言:javascript
复制
var wg sync.WaitGroup

它在该文件中的函数之间使用。

在另一个文件ex02.go (它与ex01.go没有关系,除了ex01.go和ex02.go属于同一类问题-即并发)中,我不能为waitGroup定义变量为

代码语言:javascript
复制
var wg sync.WaitGroup

我得到一个错误-“变量名在这个块中被重新声明”

有没有办法防止变量名溢出到其他文件?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-07-22 19:32:51

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

这意味着:不,没有办法将变量限定为文件的作用域。

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

票数 33
EN

Stack Overflow用户

发布于 2017-07-22 21:03:39

只有显式导入的标识符具有文件的作用域。比方说在文件中定义的wg.go

代码语言:javascript
复制
package wg
var Wg sync.WaitGroup
// and all staff common to class of problems - i.e. concurrency

然后你可以在ex1.go文件中

代码语言:javascript
复制
import wg
wg.Wg.Add(1) //use locally to file

ex2.go中也是如此

票数 5
EN

Stack Overflow用户

发布于 2017-07-22 21:05:15

我建议使用下面的信息,并将其适当地应用于您的特定问题。下面的大多数示例都来自This Medium article

Go的变量声明和作用域有一些与其他语言一致的特征,也有一些Go更特殊的特征。

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

示例:

代码语言:javascript
复制
func main() {
    {
        v := 1
        {
            fmt.Println(v)
        }
        fmt.Println(v)
    }
    // “undefined: v” compilation error
    // fmt.Println(v)
}

> ./bin/sandbox
1
1

在这个示例中,您可以看到变量的值在其声明嵌套的作用域中是“可见的”

代码语言:javascript
复制
v := 1
{
    v = 2  // assignment
    fmt.Println(v)
}
fmt.Println(v)

>./bin/sandbox
2
2

这个例子扩展了这一点,因为变量v是在外部作用域上声明的,所以我还可以重新分配v的值,而不是重新声明,并让它在任何可以“看到”v的作用域上生效。

代码语言:javascript
复制
v := 1
{
    v := 2  // short variable declaration
    fmt.Println(v)
}
fmt.Println(v)

>./bin/sandbox
2
1

最后一个例子更接近你原来的问题。这个示例显示我可以有相同的变量名,但是根据我的作用域,我可以有多个声明和多个变量。这将我们引向更多不同的

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

首先,让我们讨论一下顶层标识。顶级标识是在任何其他类型或函数声明之外声明变量、类型或函数。func main()是顶级标识的一个很好的例子。现在让我们考虑Go包中的多个文件。在Go包中考虑多个文件的一种方法是将它们都附加在一起,以形成一个非常长的文件。考虑到这一点,我们现在可以理解为什么没有文件私有变量的概念。只有package private或package public。

package private是顶层变量,它们只对包本身可见,对于可能导入此包的任何人都是不可见的。包公共对整个包可见,和任何可能导入此包的人都可以看到。这仅通过名称的第一个字母的大写来描述。

代码语言:javascript
复制
// Package Public
func Main(){...}
var MyVar;
type MyType uint64;

// Package Private
func main(){...}
var myVar;
type myType uint64;

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45253939

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档