Go Lang 实战

Go变量(一)

2019-07-30  本文已影响0人  草莓君_

一、变量
在数学概念中,变量(variable)表示没有固定值且可改变的数。但从计算机系统实现角度来看。变量是一段或多段用来存储数据的内存。
1.定义变量

    //运行时内存分配操作会确保变量自动初始化为二进制零值(zero value)
    var x int      //自动化初始化为0
    var y = false  //自动推断为bool类型

2.可一次定义多个变量

    //可一次定义多个变量
    var x, y int           //相同类型的多个变量
    var a, s = 100, "love"  //不同类型的初始化值

3.以组方式整理多行变量定义

    var (
        x, y int
        a, s = 100, "love"
    )

4.简短模式

    x := 100
    a, s := 1, "love"

注意,简短模式是有限制的,如下:

我们执行下面代码看看

var x = 100          //全局变量
func main() {
    println(&x, x) 
    x := "love"      //重新定义变量
    println(&x, x)
}

输出:

0x10bd148 100      //对比内存地址,看的出是两个不同的变量
0xc000040778 love

可以看出,原本打算修改全局变量,结果变成重新定义同名局部变量。充分体现了简短模式的限制性。

func main() {
    x := 100
    println(&x)
    x, y := 200, "love"   //这里注意啦: x 退化为赋值操作,仅有 y 是变量定义
    println(&x, x)
    println(y)
}

输出:

0xc000040780
0xc000040780 200   //通过内存地址,我们可以确认x是同一个变量
love

那么退化赋值的条件是什么呢?-> 至少有一个新变量被定义,且必须是同一作用域。
比如以下案例都不符合退化赋值:

func main() {
    x := 100
    println(&x)
    x := 200        //编译时发现报错了 no new variables on left side of :=
    println(&x, x)
}
func main() {
    x := 100
    println(&x, x)
    {
        x, y := 200, "love"      //不同作用域,全部是新变量定义
        println(&x, x, y)
    }
}

输出:

0xc000040780 100
0xc000040778 200 love

5.未使用错误
编译器将未使用的局部变量当作错误。主要是有助于培养我们良好的编码习惯。

var y = 100    //我们可以看到,全局变量是没有问题的
func main() {
    x := 100   //编译时报错了 x declared and not used
}
上一篇 下一篇

猜你喜欢

热点阅读