我有以下代码:
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
内记录时为空值
答案 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,如果结构是一个结构值,其所有字段也初始化为其类型的零值。