• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap