变量
2022-01-16 大约 3 分钟
变量相当于内存中一个数据储存空间的表示,不论是使用哪种高级程序语言编写程序,变量都是其程序的基本组成单位。
# 初始化变量
go语言在声明变量时,自动对变量对应的内存区域进行初始化操作。每个变量会初始化其类型的默认值,例如:
- 整型和浮点型变量的默认为0。
- 字符串变量的默认值为空字符串。
- 布尔型变量的默认为bool。
- 切片、函数、指针变量的默认为nil。
# 声明变量
package main
import "fmt"
func main() {
// 声明一个整型类型的变量,可以保存整型数值。
var a int
// 声明一个字符串类型的变量
var b string
// 声明一个32位浮点切片类型的变量,浮点切片表示由多个浮点类型组成的数据结构
var c []float32
// 声明一个返回值为布尔类型的函数变量,这种形式一般用于回调函数,即将函数以变量的形式保存下来,在需要的时候重新调用这个函数
var d func() bool
// 声明一个结构体类型的变量,这个结构体拥有一个整型的x字段。
var e struct {
x int
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
相关信息
go语言的每个变量都拥有自己的类型,必须经过声明才能开始用。
# 标准格式
go语言的变量声明格式为:
var 变量名 变量类型
// 变量声明以关键字var开头,后置变量类型,行尾无须分号。
var num int
// 变量的赋值
num = 10
// 声明并赋值
var num int = 12
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
注意
// 这种是错误的 类型和值不对应
var num int = 12.5
1
2
2
# 批量格式
觉得每行都用var声明变量比较繁琐?没关系,还有一种为懒人提供的定义变量的方法:
// 同时声明多个变量并赋值
var n1, n2, n3 int
fmt.Println(n1, n2, n3) // 0 0 0
// 同时声明多个变量并赋值
var n1, n2, n3 = 10, "jack", 7.8
fmt.Println(n1, n2, n3) 10 jack 7.8
// 使用var 关键字和括号,可以将一组变量定义放在一起
var (
a int
b string
c []float32
d func() bool
e struct {
x int
}
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 自动类型推断
在标准格式的基础上,将int省略后,编译器会尝试根据等号右边的表达式推到变量的类型。
var hp = 100
1
等号右边的部分在编译原理里被称为“右值”。
下面是编译器根据右值推到变量类型完成初始化的例子
var attack = 40
var defence = 20
var damage Rate float32 = 0.17
var damage float32(attack - defence) * damage Rate
fmt.Println(damage)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 短变量声明
var的变量声明还有一种更为精简的写法,例如:
hp := 100
str := "str"
// 同时声明多个变量并赋值
n1, n2, n3 := 10, "str", 200
fmt.Println(n1, n2, n3) // 10, str 200
1
2
3
4
5
6
7
2
3
4
5
6
7
这是go语言的推导声明写法,编译器会自动根据右值类型推断出左值的对应类型。
相关信息
由于使用了:=
,而不是赋值的=
,因此推导声明写法的左值变量必须是没有定义过的变量。若定义过,将会发生编译错误。
# 多重赋值
go语言的多重赋值,可以轻松完成变量的交换
// 多重赋值时,变量的左值和右值按从左到右的顺序赋值
var q int = 100
var w int = 200
q, w = w, q
fmt.Println(q, w) // 200 100
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 匿名变量
在使用多重赋值时,如果不需要在左值中接受变量,可以使用匿名变量。匿名变量的表现是一个
_
下划线,使用匿名变量时,只需要在变量声明的地方使用下划线即可。
func main() {
a, _ := getData()
_, b := getData()
fmt.Println(a, b) // 100 200
}
func getData() (int, int) {
return 100, 200
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 全局变量
package main
import "fmt"
// 定义全局变量
var n4 = 34
var n5 = 23
func main() {
// 同时声明多个变量并赋值 -- 局部变量
n1, n2, n3 := 10, "str", 200
fmt.Println(n1, n2, n3, n4, n5)
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13