1

如何覆盖 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?

4

4 回答 4

3

在这种情况下,我不确定您所说的“覆盖”是什么意思。(也让我假设 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”。

于 2013-04-17T07:37:39.317 回答
1

你不能。包是独立的。如果包 A 不导出 arg1(小写),则对于其他包 B,它是不可见的——因此不可设置。

顺便说一句:“包 A/B”对我来说看起来很奇怪。

于 2013-04-17T07:13:02.957 回答
1

您是否正在尝试做这样的事情,例如,特定位置(美国)(如果存在)会覆盖一般位置(世界)?

// 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

如果没有,请提供一个更好、更具体的示例来说明您正在尝试做的事情。

于 2013-04-17T11:53:45.373 回答
0

您可能可以使用构建标志来做到这一点:

go build -ldflags="-X 'package_path.variable_name=new_value'"

有几件事需要注意:

为了使用 ldflags,您要更改的值必须存在并且是string 类型的包级变量。这个变量可以是exported 也可以是unexported。该值不能是 const或由函数调用的结果设置其值

您将在DO 团队的这篇出色文章中找到所需的所有信息

于 2020-09-01T13:00:34.993 回答