1.2 变量、指针及赋值
1.2.1 变量和常量
与其他语言一样,Go语言也是提供常量和变量的,这是程序的基础。变量的声明使用var关键字,常量的声明使用const关键字。
定义变量的形式如下:
var name [类型] = [表达式]
注意,在使用过程中,“类型”和“表达式”两者可以省略一个,但不可以同时省略。如果省略了“类型”,该类型将根据表达式推测得出。如果省略了“表达式”,则变量会被赋予一个默认值,各变量类型的默认值如下:
▪数字类型默认为0。
▪布尔类型默认为false。
▪字符串类型默认为“”。
其他诸如接口、slice、指针、map、通道、函数的默认值是nil。如果是复合类型,如结构体,其内部所有元素被赋予对应的默认值。
除了上面的基本用法之外,变量还有下面一些特别的用法:
book/chapter01/1.2/var/main.go
1. package main
2.
3. import (
4. "fmt"
5. "math/rand"
6. )
7.
8. func main() {
9. //多个变量一起通过类型声明
10. var i,j,k int
11. fmt.Printf("i:%d,j:%d,k:%d",i,j,k)
12. fmt.Println()
13. //多个变量一起通过表达式声明
14. var a,b,c = 1,"s",true
15. fmt.Printf("a:%d,b:%s,c:%t",a,b,c)
16. fmt.Println()
17. //声明赋值的缩写
18. f := rand.Float64()*100
19. fmt.Printf("f:%g",f)
20. }
21. //执行结果
22. i:0,j:0,k:0
23. a:1,b:s,c:true
24. f:60.466028797961954
注意
这里把执行结果和代码放在了一起,从第21行以后是执行结果。
上述代码段的说明如下:
第10行表示把多个变量与对应类型一起声明,多个变量是同一类型时可以使用这种方式。第22行是其对应的输出,可以看到默认都是0。
第14行是通过表达式对一个变量列表进行定义和赋值,这种用法允许不同类型的表达式在同一行中定义。第23行是各变量的值。
第18行是短变量的使用,或者是声明和赋值一并完成的缩写或简写。如果已知一个变量要赋予的初始值,那么可以使用“:=”来表示,不需要使用var。
其实短变量的用法还可以更为灵活,比如同时给两个变量定义并赋值,示例如下:
m,n := 0,1
请注意“:=”和“=”的区别,“=”仅仅是赋值,要求变量已经存在,而“:=”是首次赋值,同时会完成定义。
变量是可变的,而与之对应的就是常量,常量的值是不可以改变的。Go语言定义常量使用的是const关键字。
注意
Go语言中的常量一般会用作全局常量,如果你的程序里常量太多,请仔细审视软件的设计。
常量的值是在程序编译的时候确定的,之后不可再变。可使用如下形式定义常量:
const LENGTH = 100
其值可以是上述示例中的数字类型,也可以是字符串或者布尔类型。
可以一次性定义多个常量:
const ( SYS="Debian" TYPE="pro" )
常量还可以同时指定类型和表达式:
const s1 = "test" const s2 string = "test"
以上两种用法中,第一种会根据等号右侧表达式的值推测出其string类型。需要指出的是,第一种用法是Go语言中的无类型用法,这种无类型也是一种类型,是一种比基本类型精度更高的类型,至少可以达到256位,比机器硬件精度更高。其实,无类型在Go语言中有六种:无类型布尔、无类型整数、无类型文字符号、无类型浮点数、无类型复数以及无类型字符串。这种无类型可以用来处理基本类型处理不了的数据,比如精度特别大的浮点数。
声明常量时可以使用常量生成器iota。iota可以通过枚举创建一系列相关的值,而且不需要明确定义类型。iota每次从0开始取值,逐次加1。
下面通过一个例子看一下枚举的实现:
book/chapter01/1.2/iota/main.go
1. package main
2.
3. import "fmt"
4.
5. type data int
6.
7.
8. const (
9. Zero data = iota
10. One
11. Two
12. Three
13. Four
14. )
15.
16. func main() {
17.
18. fmt.Println(Zero)
19. fmt.Println(One)
20. fmt.Println(Two)
21. fmt.Println(Three)
22. fmt.Println(Four)
23. }
上述代码说明如下:
第5行使用type关键字定义了一个新类型,这个新类型就是int类型。之所以要再定义data这个类型,是因为下面还要定义里面的常量。这样就达到了其他语言枚举的效果。
第8行至第14行是为data类型定义的Zero到Four五个常量,我们只在第9行为Zero赋值(同iota),后面的会自动加1。
执行程序,打印效果如下:
0 1 2 3 4
对于iota,如果仅仅是这种用法,自然是有局限性的,实际上iota是支持在表达式中使用的。
比如:
const( p2_0 = 1<<iota p2_1 p2_2 p2_3 )
通过左移运算符达到乘以2的幂的效果,数据将会分别是1、2、4、8。