无法访问函数内的全局变量

时间:2018-06-11 14:54:24

标签: variables go struct

我有以下代码:

static readonly Lazy<Logger> logger = new Lazy<Logger>(() => LogManager.GetLogger(typeof(App).FullName));

在我的package main import ( "net/http" "log" "net" "fmt" "os" "encoding/json" ) const configName string = "config.json" type Config struct { UDPServerAddress string HTTPServerAddress string } var config Config func UDProutine (query string, ch chan<- string) { log.Fatal(config.UDPServerAddress) } func main () { file,_ := os.Open(configName) defer file.Close() decoder := json.NewDecoder(file) config := Config{} err := decoder.Decode(&config) if err != nil { fmt.Println("error",err) } log.Fatal(config.UDPServerAddress) }

config.json

我的问题是,为什么它在{ "UDPServerAddress":"127.0.0.1:54", "HTTPServerAddress":"127.0.0.1:8082" } 内正确记录配置数据,但在main内记录时为空值

1 个答案:

答案 0 :(得分:1)

main()内,您使用相同的名称:config作为本地变量。这将影响全局变量。在此之后,您无法引用全局变量(有关详细信息,请参阅Refer to constant or package level variable instead of function level variable)。您将配置加载到此局部变量中,但全局config将保持不变(零),UDProutine()函数将读取/打印此全局变量。

如果要将配置加载到全局变量,请不要创建本地config变量。只需删除此行:

config := Config{}

注意:

以上行是short variable declaration,它会创建一个新变量。

您很可能只想为Config{}分配一个空的config结构值,但为此您必须使用assignment

config = Config{}

但在这种情况下不需要这样做,因为全局变量声明:

var config Config

会将config全局变量初始化为zero value,如果结构是一个结构值,其所有字段也初始化为其类型的零值。