一、常量、变量与命名规则
常量使用关键字const声明;变量可以使用关键字var声明,也可以使用快捷变量声明语法。Go语言可以自动推断出所声明变量的类型,但是如果需要显式指定其类型也是合法的,比如声明一种与Go语言的常规推断不同的类型。下面是一些声明的例子:
对于整型字面量Go语言推断其类型为int,对于浮点型字面量Go语言推断其类型为float64,对于复数字面量Go语言推断其类型为complex128 (名字上的数字代表它们所占的位数)。通常的做法是不去显式地声明其类型,除非我们需要使用一个Go语言无法推断的特殊类型。指定类型的数值常量(即这里的top)只可用于别的数值类型相同的表达式中(除非经过转换)。未指定类型的数值常量可用于别的数值类型为任何内置类型的表达式中(例如,常量limit可以用于包含整型或者浮点型数值的表达式中)。
变量i并没有显式的初始化。这在Go语言中非常安全,因为如果没有显式初始化,Go语言总是会将零值赋值给该变量。这意味着每一个数值变量的默认值都保证为0,而每个字符串都默认为空。这可以保证Go程序避免遭受其他语言中的未初始化的垃圾值之灾。
枚举
需要设置多个常量的时候,我们不必重复使用const关键字,只需使用const关键字一次就可以将所有常量声明组合在一起。(该语法也可以用于使用var关键字来声明一组变量.)如果我们只希望所声明的常量值不同,并不关心其值是多少,那么可以使用Go语言中相对比较简陋的枚举语法。
这3个代码片段的作用完全一样。声明一组常量的方式是,如果第一个常量的值没有被显式设置(设为一个值或者是iota),则它的值为零值,第二个以及随后的常量值则设为前面一个常量的值,或者如果前面常量的值为iota,则将其后续值也设为iota.后续的每一个iota值都比前面的iota值大1。
更正式的,使用iota预定义的标识符表示连续的无类型整数常量。每次关键字const出现时,它的值重设为零值(因此,每次都会定义一组新的常量),而每个常量的声明的增量为1。因此在最右边的代码片段中,所有常量(指Magenta和Yellow)都被设为iota值。由于Cyan紧跟着一个const关键字,其iota值重设为0,即Cyan的值。Magenta 的值也设为iota,但是这里iota的值为1。类似地,Yellow的值也是iota,它的值为2。而且,如果我们在其末尾再添加一个Black (在const组内部),它的值就被隐式地设为iota,这时它的值就是3。
另一方面,如果最右边的代码片段中没有iota标识符, Cyan就会被设为0,而Magenta的值则会设为Cyan的值, Yellow的值则被设为Magenta的值,因此最后它们都被设为零值。类似的,如果Cyan被设为9,那么随后的值也会被设为9。或者,如果Magenta的值设为5,Cyan的值就被设为0 (因为是组中的第一一个值,并且没有被设为一一个显式的值或者iota), Magenta的值就是5 (显式地设置),而Yellow的值也是5 (前一个常量的值)。
常量声明过程中的注意事项。在Go语言中声明和使用常量时,应注意以下事项:
- 常量的值在编译时就已经确定,在运行时不能改变常量的值;
- 常量的定义格式与变量基本相同,可以单个定义,也可以多个定义,比如常量组,这在后面的内容中会讲到;
- 等号右侧必须是常量或者常量表达式,因为只有常量表达式的值在编译时才是确定的,如果是运行时才给常量赋值,编译时就会报错;
- 常量表达式中的函数必须是Go语言内置函数,不能是用户自定义函数,或是从其他包中导入的函数,因为只有内置函数在编译之前才是确定的。
Go语言使用关键字“const”声明常量,需要指定常量名称和常量数据类型,常量一般声明格式如下:
const < constName> [ constType] = <赋值表达式>
Go语言使用关键字“var”来声明变量,需要指定变量名称和变量数据类型,变量一般声明格式如下。
var < variableName> [ variableType]
标识符
和其他程序设计语言一样,Go语言中用来对符号常量、变量、函数、数组、切片、通道等数据对象命名的有效字符序列统称为标识符(Identifier)。简单来说,标识符就是数据对象的名字。
Go语言命名规则
在Go语言中,不管是常量的命名还是变量的命名,都要遵循标识符命名规则:
- (1)变量名必须以字母或下划线开始。
- (2)必须使用英文字母、数字、下划线组成,不能出现空格或制表符。
- (3)不能使用Go语言内置关键字与保留字,如go、goto、break等。
- (4)大小写敏感,比如x和X是两个不一样的标识符。
二、数据类型
1、布尔型数据
Go语言的布尔型数据(Boolean)和其他编程语言一样,使用关键字“bool”定义。布尔型数据在内存中的字节长度为1,取值只能是“true”和“false",这和其他编程语言有所不同。比如有些编程语言可以用“零”来代替“false" ,用“非零”代替“true",Go语言则不允许这么做。
在使用布尔型数据时,需要注意以下两点。
(1)布尔类型不接受其他数据类型赋值,如让b1=1;b2=0,编译时会出现错误提示:
cannot use 1 (type int) as type bool in ass ignment
(2)布尔类型不能进行强制类型转换,比如bl= bool(1),编译时会出现错误提示:
cannot convert 1 (type int) to type bool
2、数值类型
整型
Go语言提供了11种整型,包括5种有符号的和5种无符号的,再加上1种用于存储指针的整
型类型。它们的名字和值在表2-5中给出。另外, Go语言允许使用byte来作为无符号uint8类型的同义词,并且使用单个字符(即Unicode码点)的时候提倡使用rune来代替int32.大多数情况下,我们只需要一种整型,即int.它可以用于循环计数器、数组和切片索引,以及任何通用目的的整型运算符。通常,该类型的处理速度也是最快的。
Go语言的整型支持表2-4中所列的所有算术运算,同时它们也支持表2-6中所列出的算术和
位运算。所有这些操作的行为都是可预期的。
将一个更小类型的整数转换成一个更大类型的整数总是安全的(例如,从int16转换成int32 ),但是如果向下转换一个太大的整数到一个目标类型或者将一个负整数转换成一个无符号整数,则会产生无声的截断或者一个不可预期的值。这种情况下最好使用一个自定义的向下转换函数。
浮点类型
Go语言提供了两种类型的浮点类型和两种类型的复数类型,它们的名字及相应的范围在表2-7中给出。
Go语言的浮点数支持表2-4中所有的算术运算。math包中的大多数常量以及所有函数都在表2-8和表2-10中列出。
复数类型
复数(Complex number)是指能写成a+ bi形式的数,这里a和b是实数,i是虚数单位(即-1开根)。
在Go语言中,复数实际上由两个浮点数构成,一个表示实部(real),一个表示虚部(imag),这和数学上的复数表示形式基本一致。
Go语言定义了两种复数类型:complex64和complex128,如表2-3所示。
三、运算符
1、算术运算符
Go语言的算术运算符共有5种,且都是二元运算符,如表2-4所示。由算术运算符和操作数组成的式子叫算术表达式。
使用算术运算符要注意以下两点:
- 乘除法优先级高于加减法,即先乘除,后加减。
- 在Go语言中++和 - - 是语句而非表达式。
2、关系运算符
Go语言关系运算符共有6种,都是二元运算符,如表2-5所示。由关系运算符和操作数组成的式子叫关系表达式。
3、逻辑运算符
逻辑运算符用来对操作数进行基本逻辑运算,逻辑运算包括“与”、“或”、“非”,Go语言提供了三种逻辑运算符,如表2-6所示。
逻辑运算的操作数是bool型,逻辑运算的结果也是bool型。表2-7是逻辑运算的“真值表”,表中a、b为两个操作数,其值都是bool型的。
4、位运算符
位运算符用来对操作数的二进制位进行按位操作,Go语言共提供了6种位运算符,如表2-8所示。位运算的操作数是整型或byte型,其结果也是整型或byte型。
5、通道运算符
通道(Channel),是Go语言提供的消息通信机制,它类似于单双向数据管道(Pipe),用户可以使用通道在两个或多个Goroutine之间传递消息,通道使用运算符“<-”接收或者发送数据。
通道接收数据的格式如下:
ch <- value
通道发送数据的格式如下:
value =<- ch
在上面的操作语句中,ch表示通道,value表示数据
6、运算符的优先级和结合性
Go语言规定了运算符的优先级和结合性。运算符优先级共分为7级,由7→1优先级由高→低,如表2-9所示。
Go语言运算表达式中规定全部运算符遵循“自左向右”的结合方向,比如表达式a-b+c,先执行a-b的运算,再执行加c的运算。