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

zenlife · 2015-03-16 11:43:33

正解,我差点相信楼主

#3
更多评论

执行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