编译直播点播平台EasyDSS对接第三方平台使用Go语言中全局变量与局部变量的使用注意要点

上一篇我们讲了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 语言编程过程中需要重点注意的,可能会带来很多隐藏的问题。

原文地址:https://www.cnblogs.com/easydss/p/14304187.html