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
}