乐趣区

关于go: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 <nil>
12 <nil>

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

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

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

退出移动版