Golang中容易出现的一个赋值bug

Golang中,:=同时进行了变量声明和赋值。

:=左边有多个变量时,编译器只检查左边至少有一个新变量。
如果其中有的变量已经声明,则只做赋值操作。
比如:

_ := 1 // error. Nothing New declared
a, _ := foo() // ok. Declare a
a, b := foo() // ok. Declare b, assign a
_, b := foo() // error. Nothing New declared

设想下面这种状况:

func main() {
    var err error
    if true {
        data, err := strconv.Atoi("x")
        if err == nil {
            fmt.Println("Atoi success:", data)
        }
    }
    fmt.Print(err)
}

第二次打印出来的实际是<nil>

这是因为在if的语法块中,err被重新声明了。外层的err没有经过赋值,也就是nil。

可以修改如下:

func main() {
    var err error
    if true {
        var data int
        data, err = strconv.Atoi("x")
        if err == nil {
            fmt.Println("Atoi success:", data)
        }
    }
    fmt.Print(err)
}

在子词法域中,对外层声明的变量赋值时,应保证使用=而非:=

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

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,906评论 0 38
  • 这是16年5月份编辑的一份比较杂乱适合自己观看的学习记录文档,今天18年5月份再次想写文章,发现简书还为我保存起的...
    Jenaral阅读 2,859评论 2 9
  • 变量名以一个叫做魔符 sigil 的特殊字符开头, 后面跟着一个可选的第二个叫做 twigil 的特殊字符, 然后...
    焉知非鱼阅读 993评论 0 2
  • 纵有千金亦是漂, 未若归家事二老。 遥寄银两数百万, 难抵床前水一瓢! 突然有种莫名的冲动,想回老家。不为...
    freecast阅读 300评论 2 2
  • 盼了那么久,想快点长大,快点能做什么事。终于,这一天要来了。不久后,我就会在上班这条路上一去不复返,正式踏...
    金塔196彭海讯阅读 363评论 2 3