我建议您参考以下信息并将其适当地应用于您的具体问题。以下大部分示例来自This Medium article。
Go 的变量声明和作用域有几个特征与其他语言一致,有些特征更适合 Go。
更一致的特征处理块和变量声明。如果您在一个块中声明一个变量v,那么嵌套到此的每个块都可以“看到”v。如果您在其中一个嵌套块中重新声明 a ,那么当您离开这个内部块时,您会将该值丢失给 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
最后一个示例更接近您的原始问题。这表明我可以有相同的变量名,但根据我的范围有多个带有多个变量的声明。这让我们更加与众不同
更多不同的特性涉及 Go 的包私有和公共声明以及顶级标识的概念。
首先让我们谈谈顶级识别。顶级标识是在任何其他类型或函数声明之外声明变量、类型或函数。 func main() 是顶级标识的一个很好的例子。现在让我们考虑一个 Go 包中的多个文件。考虑 Go 包中的多个文件的一种方法是将它们全部附加在一起以形成一个非常长的文件。考虑到这一点,我们现在可以看到为什么没有文件私有变量的概念。只有包私有或包公共。
包私有是顶级变量,仅对包本身可见,对可能导入此包的任何人不可见。包 public 对整个包和任何可能导入此包的人都是可见的。这仅通过名称的第一个字母的大写来描述。
// Package Public
func Main(){...}
var MyVar;
type MyType uint64;
// Package Private
func main(){...}
var myVar;
type myType uint64;
请注意,大小写确实很重要,main() 和 Main() 确实不调用相同的函数。您也可以使用它来解决您的问题,但我不建议仅仅为了绕过重新声明而更改大小写。