go语言的变量定义的坑

go语言以语法简洁著称,但变量定义比较麻烦,为了方便go语言提供了更加简便的变量声明,同时初始化的语法

名字 := 表达式

这种方式可以声明初始化一组变量:

i, j := 0, 1

尤其是函数有多返回值的时候,异常方便,所以在go语言代码中比较多见。但其中确有难以察觉的坑。

先看一个小例子:

package main

import "fmt"

func main() {
    cursor := 10

    for cursor != 0 {
        cursor, i := cursor-10, 0
        i++
        fmt.Println(i, cursor)
    }
}

在这个例子中,原本希望循环一次后,cursor 变为零,程序退出循环。实际的运行结果却是:

1 0
1 0
1 0
1 0
1 0
1 0
1 0
.... 无限循环

这是为什么呢?
:= 左边变量中只要有一个未定义变量就可以。依据程序本意,已经在第6行定义了cursor, 所以在第9行:= 语句中只是i变量是既声明又初始化,而curosor 仅仅是赋值而已。想法很好,但现实是第6行的cursor变量和:=左边的变量不是一个作用域,在这个作用域可以再定义一个cursor变量,所以实际上第9行cusor 就被重新定义了。到for 循环位置新定义的变量cursor已经离开作用域,也就是6行定义的cursor起作用,即cursor = 10, 循环无法退出。

知道原因大家就可以想出很多解决方案。举个简单的例子如下:

func main() {
    cursor := 10
    for cursor != 0 {
                i := 0
        cursor, i = cursor-10, 0
        i++
        fmt.Println(i, cursor)
    }
}

一切静好...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。