• 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

  • 相关阅读:
    基于ChatGPT的大型语言模型试用心得
    【二分法】 超清晰思路总结+模板套路化二分法 ,看不懂你打我。
    设计模式六大原则
    【五、接口自动化测试】5分钟掌握python + requests接口测试
    第七章 贝叶斯分类器(下)
    并发编程系列之Lock锁可重入性与公平性
    Kotlin Lambda表达式与标准库中的高阶函数
    SORA 到底是什么?如何用bitget wallet购买?
    自动创建word文档的exe文件,自定义文件名、保存路径
    实用技巧:在C和cURL中设置代理服务器爬取www.ifeng.com视频
  • 原文地址:https://blog.csdn.net/jiaobuchong/article/details/127035814