如何用go语言覆盖嵌套包中的变量?

时间:2013-04-17 07:06:16

标签: go

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

4 个答案:

答案 0 :(得分:3)

在这种情况下,我不确定你的意思是“覆盖”。 (另请假设file1.go是'package a',file2.go是'package b')

如果您要访问包含在“a”包内/包内的包“b”中定义的Arg1,则为:

// In package "a"
x = Arg1    // references a.Arg1
y = b.Arg1  // references b.Arg1

然而,这里没有任何类似的重写。在包“a”中,a Arg1和b Arg1都可以作为不同的实体访问;后来通过强制性限定词'b'。

答案 1 :(得分:1)

你做不到。包是独立的。 如果包A不导出arg1(小写) 它是不可见的 - 因此不可设置 - 另一个包B。

顺便说一下:“包装A / B”对我来说很奇怪。

答案 2 :(得分: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

如果没有,请提供一个更好,更具体的例子说明你想要做什么。

答案 3 :(得分:0)

您可能可以使用构建标记来完成它:

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

需要注意的事情:

为了使用ldflags,要更改的值必须存在,并且必须是类型字符串的程序包级变量。此变量可以已导出或未导出。值不能为const 或通过函数调用的结果设置其值

this DO团队出色的帖子中您将找到所有需要的信息