首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >无法访问函数内的全局变量

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

Stack Overflow用户
提问于 2018-06-11 22:54:24
回答 1查看 1.1K关注 0票数 -1

我有以下代码:

代码语言:javascript
复制
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

代码语言:javascript
复制
{
  "UDPServerAddress":"127.0.0.1:54",
  "HTTPServerAddress":"127.0.0.1:8082"
}

我的问题是,为什么它在main中正确地记录配置数据,而在UDPRoutine中记录它的空值

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-11 22:55:23

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

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

代码语言:javascript
复制
config := Config{}

备注:

上面的代码行是一个short variable declaration,它创建了一个新变量。

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

代码语言:javascript
复制
config = Config{}

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

代码语言:javascript
复制
var config Config

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50800611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档