我有以下代码:
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
中正确地记录配置数据,而在UDPRoutine
中记录它的空值
发布于 2018-06-11 22:55:23
在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,如果是structs,它是一个结构值,它的所有字段也被初始化为其类型的零值。
https://stackoverflow.com/questions/50800611
复制相似问题