Go使用全局变量要小心闭包

zenlife ·
tianqy
越努力,越幸运!
和闭包没任何关系,就是全量初始化顺序的问题,var logger = AppLog()优先于InitConf()函数执行,等InitConf()执行后,logger并没有更新取值,故触发宕机,要么在InitConf中重复执行logger = AppLog(),要么修改logger和AppLog使用二级指针
#5
更多评论
执行main函数之前,所有的全局变量应该已经被初始化了,此时 logger为nil(因为__logger 为 nil)。即使 在main函数里,InitConf 执行后, __logger 非nil,但是 logger 仍然是nil。另外,在 http.HandleFunc 之前,调用logger.Debug() ,必然panic,因为 logger为nil。
#1
David
Life is hard but please enjoy it!
这个问题和闭包没什么关系。 var logger = AppLog() 这句话使全局变量的初始化,会在`main`执行之前被执行,此时`InitConf`显然还没有执行,从而`__logger`必然是`nil`,通过`AppLog()`返回给了`logger`导致其为`nil`。之后`InitConf`虽然把`__logger`初始化了,但是不会改变`logger`的值。 正确的做法是把`InitConf`改名成`init`,变成 package 初始化的一部分。
#2