Go中局部全局变量的区分

这是可能也许是容易混淆滴,先上1个例子:

package main
import "fmt"
var nickname = "大虾"
func main() {
    show() //大虾
    change() //小虾
    show() //大虾
    fmt.Print(nickname) //大虾
}

func show() { print(nickname) }

func change() {
    nickname := "小虾"
    print(nickname)
}

上面会输出:

大虾大虾小虾大虾

我们稍微改动下:

package main
import "fmt"
var nickname = "大虾"
func main() {
    show() //大虾
    change() //小虾
    show() //这里不再是 大虾 而是 虾
    fmt.Println(nickname) //这里不再是 大虾 而是 虾
}

func show() { print(nickname) }

func change() {
    nickname = "小虾" // 注意这里不再是 nickname := "小虾"
    print(nickname)
}

上面会输出:

大虾小虾小虾小虾

可见声明的全局变量var nickname 在函数change里面重载更新了,再次输出时已经是被更新后的值。
我们再看一个函数变量域

package main
var nickname string

func main() {
    nickname = "大虾"
    print(nickname) //大虾
    change()
    println(nickname) //大虾
}

func change() {
    nickname := "小虾"
    print(nickname) //小虾
    show() //大虾 上面只是nickname := 只是初始化声明变量。仅在函数内有效,全局变量nickname未变
}

func show() {
    print(nickname)
}

上面会输出:

大虾小虾大虾大虾

通过上面几个例子,我想大家也应该有深入的理解啦。

原文地址:https://www.cnblogs.com/phpper/p/9934833.html