上一篇我们讲了EasyDSS对接金山云或者阿里云等平台碰到的编译问题,具体内容大家可以阅读《EasyDSS对接云服务Go语言中dowhile语句的实现方法》。
在 EasyDSS 的开发过程中,有时会进行以下代码编写:
var (
/* 本模块使用的全局变量 */
gClientVS *vs.Client
)
// 初始化 VS 模块
func initVS() error {
gClientVS, err := vs.NewClientWithAccessKey(gCfg.Aliyun.RegionID, gCfg.Aliyun.AccessKeyID, gCfg.Aliyun.AccessKeySecret)
if err != nil {
return err
}
return nil
}
以上代码其中 gClientVS 为全局变量,未进行初始化操作,即此时 gClientVS 为 nil。
在 initVS() 函数中,第一行初始化了 gClientVS,然后其他模块就可以调用。但是在运行过程中直接出现了崩溃错误,出现 panic ,程序崩溃。
以上代码在 initVS() 函数,第一行因为使用了 := 赋值,gClientVS 会新创建一个内存变量,该变量是局部变量。因此全部变量中的 gClientVS 仍然是空,因此其他模块调用的时候,就会出现空指针异常。
按照以下问题修改代码,即可解决该问题的出现:
var (
/* 本模块使用的全局变量 */
gClientVS *vs.Client
)
// 初始化 VS 模块
func initVS() error {
var err error
gClientVS, err = vs.NewClientWithAccessKey(gCfg.Aliyun.RegionID, gCfg.Aliyun.AccessKeyID, gCfg.Aliyun.AccessKeySecret)
if err != nil {
return err
}
return nil
}
函数中并未使用 := 进行赋值操作,直接采用 = 进行赋值操作。就不会创建一个新的局部变量,直接使用了全局的变量 gClientVS, 为该全局变量进行了赋值。该点是在 Go 语言编程过程中需要重点注意的,可能会带来很多隐藏的问题。