如何覆盖 go from package 中的变量?
例如:
文件1.go
package A
import "A/B"
var Arg1 = "Hello"
文件2.go
package A/B
var Arg1 = "World"
如果 file2.go 中存在 arg1,我如何覆盖 file1.go 中的 arg1?
如何覆盖 go from package 中的变量?
例如:
文件1.go
package A
import "A/B"
var Arg1 = "Hello"
文件2.go
package A/B
var Arg1 = "World"
如果 file2.go 中存在 arg1,我如何覆盖 file1.go 中的 arg1?
在这种情况下,我不确定您所说的“覆盖”是什么意思。(也让我假设 file1.go 是“包 a”,而 file2.go 是“包 b”)
如果您的意思是访问Arg1
,在包“a”内/从包“b”中定义,那么例如:
// In package "a"
x = Arg1 // references a.Arg1
y = b.Arg1 // references b.Arg1
但是,这里没有发生任何类似覆盖的事情。在包“a”中,aArg1
和 bArg1
都可以作为不同的实体访问;后者通过强制限定符“b”。
你不能。包是独立的。如果包 A 不导出 arg1(小写),则对于其他包 B,它是不可见的——因此不可设置。
顺便说一句:“包 A/B”对我来说看起来很奇怪。
您是否正在尝试做这样的事情,例如,特定位置(美国)(如果存在)会覆盖一般位置(世界)?
// file A/B.go
package B
var location = "USA"
func Location() string {
return location
}
// file A.go
package A
import "A/B"
var location = "World"
func Location() string {
loc := B.Location()
if len(loc) == 0 {
loc = location
}
return loc
}
// file main.go
package main
import (
"A"
"fmt"
)
func main() {
fmt.Println("Hello,", A.Location())
}
输出:
Hello, USA
如果没有,请提供一个更好、更具体的示例来说明您正在尝试做的事情。
您可能可以使用构建标志来做到这一点:
go build -ldflags="-X 'package_path.variable_name=new_value'"
有几件事需要注意:
为了使用 ldflags,您要更改的值必须存在并且是string 类型的包级变量。这个变量可以是exported 也可以是unexported。该值不能是 const或由函数调用的结果设置其值
您将在DO 团队的这篇出色文章中找到所需的所有信息