go := 符号 引起的 作用域的坑

一、:= 符号引起的坑

先看一下,下面一段代码
我们执行两个步骤
第一步:p = 10
第二步:p + 1
预期是打印 p = 11

var p int = 5

func TestYu5(t *testing.T) {
    //1 p=10
    p, err := Ten()
    //2 p+1
    AddP()
    t.Log(p, err)
}
func Ten() (int, error) {
    return 10, nil
}
func AddP() int {
    return p + 1
}

输出:

10

为什么不是11?
主要是 := 符号,在这里等同于 var
此时相当于,重新申请变量,在函数内TestYu5内的p,是局部变量。作用域返回是本函数。
而AddP函数里的p,用的是全局变量p

二、if,for等控制语句的作用域是{}覆盖的范围

下面的代码,我们
第一步 p = 10
第二步 p = 12
第三部 p = 10
我们希望最后的输出是10

func TestYu6(t *testing.T) {
    //第一步 p = 10
    p, err := Ten()
    //第二步 p = 12
    p = 12
    if true {
        //第三部,让p重新等于10
        p, err := Ten()
        t.Log(p, err)
    }
    //最后输出p,期望值是10
    t.Log(p, err)
}
func Ten() (int, error) {
    return 10, nil
}

输出:

10 
12 

为什么最后的p是12 ?
因为我们在if,用了:= 相当于在if语句里,重新申明了一个变量p,它的作用域值在if语句内。
如何正确的使用?

if true {
        //第三部,让p重新等于10
        p, err = Ten()
        t.Log(p, err)
    }

这样就行了。此时的p,是外面函数内的p,作用域范围是整个函数内。

你可能感兴趣的:(go)