1、含义
变量本质上就是一小块内存,用于存储数据,在程序的运行中数值是可以改变的
2、声明变量
1、方式一:先定义再赋值
// 1、先定义在赋值
var age int32
age = 12
fmt.Printf("%d \n", age)
var a int
a = 10
fmt.Printf("a的类型为:%T, 值为:%d\n", a, a)
2、方式二:定义赋值写一行
// 2、写在一行
var age2 int32 = 50
fmt.Printf("年龄为:%d \n", age2)
var b int = 20
fmt.Printf("b的类型为:%T, 值为:%d\n", b, b)
3、方式三:自动类型推断,go语言是一个强类型语言
// 3、自动类型推断
var age3 = 20
fmt.Printf("年龄为:%d \n", age3)
var c = "张三"
fmt.Printf("c的类型为:%T, 值为:%s\n", c, c)
4、方式四:简短声明
// 4、简明写法
name := "ly"
fmt.Printf("姓名为:%s \n", name)
d := 1.2
fmt.Printf("d的类型为:%T,值为:%f\n", d, d)
5、变量多声明
// 多变量定义
// 1、先定义再赋值
var x, y, z int
x = 10
y = 20
z = 30
fmt.Printf("x:%d \t y:%d \t z:%d \n", x, y, z)
// 2、先定义再赋值
var a1, a2, a3 = 1, 2, 3
fmt.Printf("a1:%d \t a2:%d \t a3:%d \n", a1, a2, a3)
// 3、定义一组值
var (
name1 = "ly"
age1 = 20
sex = "male"
)
// 修改上面的值
name1 = "zs"
fmt.Printf("name1:%s \t age1:%d \t sex:%s \n", name1, age1, sex)
6、变量重复赋值
var num int
num = 10
fmt.Printf("num的类型为:%T , 值为: %d , 地址为:%p \n", num, num, &num)
num = 200
fmt.Printf("num的类型为:%T , 值为: %d , 地址为:%p \n", num, num, &num)
变量使用完了,也不需要我们程序员去回收内存。Go语言和Java一样有GC垃圾回收机制
7、变量注意事项
- 变量必须先定义才能使用
- go语言是静态语言,要求变量的类型和赋值的类型必须一致。
- 变量名不能冲突。(同一个作用于域内不能冲突)简短定义方式,左边的变量名至少有一个是新的
- 简短定义方式,不能定义全局变量。
- 变量的零值。也叫默认值。
- 整型: 默认值是0
- 浮点类型:默认是0
- 字符串:默认值""
- 变量定义了就要使用,否则无法通过编译。
如果在相同的代码块中,我们不可以再次对于相同名称的变量使用初始化声明,例如: a:= 20 就是不被允许的,编译器会提示错误
no new variables on left sideof:=
,但是a=20 是可以的,因为这是给相同的变量赋予一个新的值。
如果你在定义变量a之前使用它,则会得到编译错误 undefined:a。如果你声明了一个局部变量却没有在相同的代码块中使用它同样会得到编译错误,例如下面这个例子当中的变量 k:
// 错误示例
// num := 300 // No new variables on the left side of ':='
// n, m := 10, 20
// fmt.Printf("m:%d \n", m) // n declared but not used
// fmt.Printf("k:%d \n",k) // Unresolved reference 'k'
// var k = 10