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

  • 相关阅读:
    @transactional注解下失效
    string.format格式化字符串中转义大括号“{}”
    ArrayList循环遍历并删除元素的常见陷阱
    HashMap、HashTable与ConcurrentHashMap区别
    -webkit-,-moz-,-ms-,-o-具体指什么了?
    常用js正则表达式大全
    hashcode详解
    如何区分oracle服务器、oracle客户端、plsql?
    Oracle Client(客户端) 安装与配置
    Openresty使用
  • 原文地址:https://www.cnblogs.com/easydss/p/14304187.html
Copyright © 2011-2022 走看看