zoukankan      html  css  js  c++  java
  • 编译直播点播平台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 语言编程过程中需要重点注意的,可能会带来很多隐藏的问题。

  • 相关阅读:
    [GL]行星运行1
    一个图的带权邻接表存储结构的应用
    [GDAL]3.影像金字塔构建
    [GDAL]1.GDAL1.8.1编译与第一个程序
    [GDAL]2.读取栅格和矢量数据
    C#迭代器
    GoogleEarth缓存机制探索
    AE开发三维的不足!
    [GDAL]4.影像的读取和显示
    [STL学习]1.概述
  • 原文地址:https://www.cnblogs.com/easydss/p/14304187.html
Copyright © 2011-2022 走看看