英文:
How to override variables from nested packages in go language?
问题
如何在Go语言中从包中覆盖变量?
例如:
file1.go
package A
import "A/B"
var Arg1 = "Hello"
file2.go
package A/B
var Arg1 = "World"
如果在file2.go中存在arg1,我该如何在file1.go中覆盖arg1?
英文:
How do I override variables in go from package ?
For example:
file1.go
package A
import "A/B"
var Arg1 = "Hello"
file2.go
package A/B
var Arg1 = "World"
How can I override arg1 in file1.go if arg1 exist in file2.go?
答案1
得分: 3
我不确定你在这种情况下所指的“覆盖”的意思。 (还让我假设file1.go是“包a”,file2.go是“包b”)
如果你的意思是在“包a”内部/从“包a”中访问在“包b”中定义的Arg1,那么可以这样做:
// 在“包a”中
x = Arg1 // 引用a.Arg1
y = b.Arg1 // 引用b.Arg1
然而,在这里并没有发生类似覆盖的情况。在“包a”中,a的Arg1和b的Arg1都作为不同的实体可访问;后者需要使用强制限定符“b”。
英文:
I'm not sure what you mean by "overriding" in this case. (Also let me assume file1.go is 'package a' and file2.go is 'package b')
If you mean to access Arg1, defined in package "b" inside/from within package "a", then eg.:
// In package "a"
x = Arg1 // references a.Arg1
y = b.Arg1 // references b.Arg1
However, nothing resembling overriding happens here. In package "a" both a's Arg1 and b's Arg1 are accessible as different entities; the later via a mandatory qualifier 'b'.
答案2
得分: 1
你不能。包是自包含的。
如果包A不导出arg1(小写)
它是不可见的 - 因此也不能设置 -
对于另一个包B。
顺便说一句:“包A/B”对我来说看起来很奇怪。
英文:
You can't. Packages are self-contained.
If package A doesn't export arg1 (lowercase)
it is not visible -- and thus not set-able --
for an other package B.
BTW: "package A/B" looks pretty strange to me.
答案3
得分: 1
你是否试图做类似这样的事情,例如,如果存在特定位置(美国),则覆盖一般位置(世界)?
// 文件 A/B.go
package B
var location = "USA"
func Location() string {
return location
}
// 文件 A.go
package A
import "A/B"
var location = "World"
func Location() string {
loc := B.Location()
if len(loc) == 0 {
loc = location
}
return loc
}
// 文件 main.go
package main
import (
"A"
"fmt"
)
func main() {
fmt.Println("Hello, ", A.Location())
}
输出:
Hello, USA
如果不是,请提供一个更好和具体的示例,说明你想要做什么。
英文:
Are you trying to do something like this, where, for example, a specific location (USA), if present, overrides a general location (World)?
// 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())
}
Output:
Hello, USA
If not, please provide a better and specific example of what you are trying to do.
答案4
得分: 0
你可以使用构建标志来完成这个任务:
go build -ldflags="-X 'package_path.variable_name=new_value'"
但是需要注意以下几点:
- 为了使用ldflags,你想要改变的值必须存在,并且是一个字符串类型的包级变量。这个变量可以是导出的或者未导出的。这个值不能是常量,也不能通过函数调用的结果来设置。
你可以在这篇来自DO团队的优秀文章中找到所有需要的信息。
英文:
You could probably do it using a build flag :
go build -ldflags="-X 'package_path.variable_name=new_value'"
Couple of things to be aware of though :
In order to use ldflags, the value you want to change must exist and be a package level variable of type string. This variable can be either exported or unexported. The value cannot be a const or have its value set by the result of a function call
You'll find all the information needed in this excellent post from DO team
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论