Go微服务实战
上QQ阅读APP看书,第一时间看更新

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。