Go漫游笔记-03-变量和常量

变量

我们知道,变量是程序的基本组成元素,我们可以通过定义变量,来申请和使用数据的存储空间。

声明

Go 声明变量的语法与 Java 是不一样的,需要关键字 var ,并且,先写变量名,再写类型名称。

1
2
3
4
5
6
7
8
9
// 定义单变量
var v int32 // 自动初始为零值

// 同时定义多个变量
var a, b, c int32
var (
x int32
y float32
)

初始化

使用 var 声明变量,如果没有提供初始化值,那么,变量会自动初始化为零值。
如果在声明时候,提供了初始化值,那么,又可以省略类型名称,因为编译器会自动推断出变量的类型。
在函数内部,使用 := 还可以进一步省略 var 关键字。不过,当我们使用这种方式声明变量时,需要注意检查,这个操作是否会修改到全局变量,以免出错。

1
2
3
4
5
6
7
8
9
var v int32 = 1         // 带初始化值

var v = "HelloWorld" // 根据初始化值推断出类型

v := 2 // 在函数内部,使用 := 可以省略 var

// 还可以同时定义并初始化多个变量
var i, j = "apple", 3
m, n := false, 4.0

赋值

变量的赋值操作在声明之后,Go 的特别之初在于,支持多重赋值。
其实上面的例子(同时初始化多个变量)已有所展示。
除此之外,多重赋值一个典型的应用就是,交换变量。
另外,关于多重赋值,还需要注意的是,在进行多重赋值的时候,会先计算所有相关值,再从左到右进行赋值操作。

1
2
3
4
5
6
7
8
var v int32
v = 10 // 赋值

x, y := 1, 2 // 多重赋值
x, y = y, x // 利用多重赋值,直接完成交换

a, i := [2]int32{1, 2}, 0
i, a[i] = 1, 3 // i = 0, a[i] = a[0] = 1 --> i = 1, a[0] = 3

匿名变量

Go 的函数支持同时返回多个值,但是,有时候我们可能需要关注其中的某一个或几个值,这时候就可以使用到 _ 这个匿名变量。

1
2
3
4
5
6
func GetName() (firstName, lastName, nickName string) {
return "Franky", "Zhu", "Franky Zhu"
}

// 只关注 nickName
_, _, nickName := GetName()

常量

常量是指编译期间已知且不可改变的值(数值类型、布尔类型、字符串)。

声明

Go 使用 const 关键字定义常量。

1
2
3
4
5
6
const PI float64 = 3.141592653

const (
HELLO string = "Hello"
WORLD string = "World"
)

初始化

由于常量的赋值是一个编译期行为,因此,常量在声明的时候就需要进行初始化,并且初始化的表达式,应该是字面常量,或者是在编译期就能够计算出结果的表达式。
在常量组中,如不提供类型和初始化值,那么,就默认与上一个的常量相同。

1
2
3
4
5
6
7
8
const EIGHT = 1 << 3            // OK
const HOME = os.GetEnv("HOME") // 编译错误

const (
HELLO string = "Hello"
WORLD = "World" // 类型推断
THE_SAME_WORLD // "World"
)

枚举

学习常量,很自然就会想到枚举。
Go 里面的枚举相对简单,它使用了一个特殊的常量 iota
iota 会在每一个 const 出现的时候,被重置为 0 ,然后,每出现一次 iota ,它的值就会自动 +1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
const (
A = iota // A = 0
B = iota // B = 1
C // C = 2
)

const (
D = iota // D = 0
E // E = 1
F // F = 2
)

// 如果你不习惯从 0 开始,那么可以
const (
Sunday = iota + 1 // 1
Monday // 2
Tuesday // 3
Wednesday // 4
Thursday // 5
Friday // 6
Saturday // 7
)

// 或者
const (
_ = iota // 0
Sunday // 1
Monday // 2
Tuesday // 3
Wednesday // 4
Thursday // 5
Friday // 6
Saturday // 7
)