• golang 短变量声明看这一篇就够了


    刚开始看 golang 短变量声明的时候真有些懵逼,「变量重声明」是什么情况,有的时候还报错说 No new variables on the left side of ':='

    结合官方文档的一些描述 Short_variable_declarations ,好像是有些理解了,
    先对短变量重声明来个个人理解吧:

    1. 只能在代码块作用域里使用 := 来声明一个新变量。
    2. 在同一代码块作用域多次使用 := 来重声明相同变量,重声明的类型要操持一致,:=左边定义的变量名 list 需要有一个是新变量,不然会报错。最后重声明出来的相同变量名的地址是一样的。

    下面来看看示例。

    短变量重声明只能在局部代码块作用域里

    func main() {
        // 作用域 1
    	err := test() 
    	if true {
    	    // 作用域 2
    		err := test() 
    	}
    	if true {
    	    // 作用域 3
    		err := "error"
    	}
    }
    
    func test() (err error) {
    	return errors.New("error")
    }
    

    局部代码块作用域,比如 if、for、switch 作用域。

    不同作用里声明的变量是新的,地址不一样哦

    func main() {
    	err := test1() //声明并赋值一个error类型的变量
    	fmt.Printf("%v:%s\n", &err, err.Error())
    	if true {
    		err := test1() //在 if 代码块中声明并赋值一个 error 类型的变量,与if外的不同,这是一个新的变量,是新的地址
    		fmt.Printf("%v:%s\n", &err, err.Error())
    	}
    	if true {
    		err := "error" //在 if 代码块中声明并赋值一个 error 类型的变量,与 if 外的不同,这是一个新的变量,是新的地址
    		fmt.Printf("%v:%s\n", &err, err)
    	}
    	a, err := test2()
    	fmt.Println("a: ", a)
    	fmt.Printf("%v:%s\n", &err, err.Error())
    }
    
    func test1() (err error) {
    	return errors.New("error")
    }
    
    func test2() (a int, err error) {
    	return 5, errors.New("error")
    }
    

    输出:

    0x1400008e210:error       // main 作用域地址一样
    0x1400008e240:error       // if 作用域 1 地址,新的地址
    0x1400008e270:error       // if 作用域 2 地址,新的地址
    a:  5
    0x1400008e210:error      // main 作用域地址一样
    

    同一作用域重声明的相同变量名并没有被创建多次,只是将新的值赋予原先的变量。

    同一代码块作用域里,:= 重声明变量的左边必须有一个是新变量,不然会报错

    func main() {
    	err := test1()
    	fmt.Printf("%v:%s\n", &err, err.Error())
    	if true {
    		err := test1()
    		//err := test1()     // 提示错误: No new variables on the left side of ':=
    		//_, err := test2()    // 提示错误: No new variables on the left side of ':=
    		a, err := test2() // ok, work well, 有变量 a
    		fmt.Println("a: ", a)
    		_, b, err := test3()   // work well, 有新变量 b
    		fmt.Println("a: ", a, ", b: ", b) 
    		fmt.Printf("%v:%s\n", &err, err.Error())
    	}
    }
    
    func test1() (err error) {
    	return errors.New("error")
    }
    
    func test2() (a int, err error) {
    	return 5, errors.New("error")
    }
    
    func test3() (a int, b int, err error) {
    	return 5, 6, errors.New("error")
    }
    

    上面代码中的这两个左边都是没有新变量的,所以报错(不要问为什么,暂且记住这是 go 语法规定的就好了):

    err := test1()    
    _, err := test2()   
    

    :=左边如果有新变量名了,运行就变得丝滑了:

    a, err := test2()     // ok, work well
    fmt.Println("a: ", a)
    

    参考:
    GO的短变量声明
    Short_variable_declarations

  • 相关阅读:
    小数第n位【蓝桥杯】
    (最新+详细+Pycharm远程调试GUI程序)解决qt.qpa.xcb: could not connect to display问题
    LeetCode 137. 只出现一次的数字 II
    Nagios自定义插件的编写规范
    算法学习之 背包01问题 , 备战leecode
    Node.js的基本使用(四)项目实战——项目初始化及用户注册登录接口的实现
    JQuery快速入门
    NLP常见任务的分类指标
    PHP反序列化漏洞
    2022-08-18 多线程安全的Parallel Hashmap
  • 原文地址:https://blog.csdn.net/jiaobuchong/article/details/127035814