• [golang 易犯错误] golang 局部变量初始化:=的陷阱


        我们知道,golang中局部变量初始化方法(使用“:=”创建并赋值),让我们在使用变量时很方便。但是,这也是易犯错误的地方之一。特别是这个初始化符还支持多个变量同时初始化,更特别的是它还支持原有变量赋值和新变量创建并赋值同时进行!也就是说如果有部分变量不存在的而另外一些是已声明好的,用:=来初始化部分变量同样有效。这其实也没什么,更方便了嘛。但是,go的好多语句还支持局部前置语句,比如在if,for,switch等语句的初始化条件语句中。在这些地方,当你以为使用了原有变量的时候,实际上go已经为你创建了一个局限于这些语句作用范围的新变量!

        文字功力太低,说了半天你可能更糊涂了,还是直接用代码说明吧。

    //这段代码,一开始声明了code,然后用Atoi解析,此时err没有声明,所以使用了局部变量创建赋值“:=”
    //下面的写法正确,code还是已存在的那个变量,正确解析后已经变为5
    func test(){ var code int
    scode:="5" code,err:=strconv.Atoi(scode); if err!=nil{ return err; } return code; }

    //如果,将上面的函数改为下面的样子,结果就不对了,因为在if的后面的初始化语句中使用:=实际上告诉go创建新的在if语句作用域下的局部变量!
    //此时,code和err都是新的变量,因此,解析后语句外部的code不受影响,结果错误!
    func test(){
    var code int
    scode:="5"
    if code,err:=strconv.Atoi(scode); err!=nil{
    return err;
    }
    return code;
    }

    下面,用一段完整的代码演示一下。

    package main
    
    import "fmt"
    import "strconv"
    
    func main() {
        fmt.Println("======conv func 1:")
        conv1()
        fmt.Println("======conv func 2:")
        conv2()
    }
    func conv1(){
        code:=10
        scode:="5"
        code,err :=strconv.Atoi(scode);
        if err!=nil{
            fmt.Println("convert error",err," code=",code);
        }
        fmt.Println("after conv ,code=",code);
    }
    func conv2(){
        code:=10
        scode:="5"
        if code,err :=strconv.Atoi(scode);err!=nil{
            fmt.Println("convert error",err," code=",code);
        }
        fmt.Println("after conv ,code=",code);
    }

    代码的执行结果:

    ======conv func 1:
    after conv ,code= 5
    ======conv func 2:
    after conv ,code= 10
    
    Program exited.
  • 相关阅读:
    cdoj793-A Linear Algebra Problem
    C语言各种数据类型取值范围
    taro 在components文件夹中 新建组件时,组件支持自定义命名,但是不能大写开头
    taro 不支持render中,使用函数多条件渲染
    taro 引用相对路径图片
    taro CSS Modules 的使用
    taro refs引用
    taro 环境判断
    input 禁止 复制 粘贴 剪切 操作
    windows 系统中 use arrow keys怎么操作?
  • 原文地址:https://www.cnblogs.com/dajianshi/p/4211848.html
Copyright © 2020-2023  润新知