整型
Go语言同时提供了有符号和无符号类型的整数运算。这里有int8、int16、int32和int64四种截然不同大小的有符号整形数类型,分别对应8、16、32、64bit大小的有符号整形数,与此对应的是uint8、uint16、uint32和uint64四种无符号整形数类型。
注意:Unicode字符rune类型是和int32等价的类型,通常用于表示一个Unicode码点。这两个名称可以互换使用。同样byte也是uint8类型的等价类型,byte类型一般用于强调数值是一个原始的数据而不是一个小的整数,有一种无符号的整数类型uintptr,没有指定具体的bit大小但是足以容纳指针。uintptr类型只有在底层编程是才需要,特别是Go语言和C语言函数库或操作系统接口相交互的地方。**不管它们的具体大小,int、uint和uintptr是不同类型的兄弟类型。**其中int和int32也是不同的类型,即使int的大小也是32bit,在需要将int当作int32类型的地方需要一个显式的类型转换操作,反之亦然。
运算符优先级
Go语言中关于算术运算、逻辑运算和比较运算的二元运算符,它们按照先级递减的顺序的排列:
* / % << >> & &^
+ - | ^
== != < <= > >=
&&
||
Go语言运算符有5个优先级,自上到下自左到右优先级依次降低,运算符+、-、*和/可以适用与于整数、浮点数和复数,但是取模运算符%仅用于整数间的运算。对于不同编程语言,%取模运算的行为可能并不相同。在Go语言中,%取模运算符的符号和被取模数的符号总是一致的,因此-5%3和-5%-3结果都是-2。除法运算符/的行为则依赖于操作数是否为全为整数,比如5.0/4.0的结果是1.25,但是5/4的结果是1,因为**整数除法会向着0方向截断余数。**一个算术运算的结果,不管是有符号或者是无符号的,如果需要更多的bit位才能正确表示的话,就说明计算结果是溢出了。**超出的高位的bit位部分将被丢弃。**如果原始的数值是有符号类型,而且最左边的bit为是1的话,那么最终结果可能是负的。
两个相同的整数类型可以使用下面的二元比较运算符进行比较;比较表达式的结果是布尔类型。基本类型比如整型、浮点型、字符串都是可以比较的,但不是所有类型都可以比较
== equal to
!= not equal to
< less than
<= less than or equal to
> greater than
>= greater than or equal to
位运算
& 位运算 AND
| 位运算 OR
^ 位运算 XOR
&^ 位清空 (AND NOT)
<< 左移
>> 右移
注意:^为一元运算符时表示按位取反也就是说,它返回一个每个bit位都取反的数。移位运算不能移动负数个位数。
package main
import "fmt"
func main(){
var x int8 = 127
var y int8 = 6
fmt.Printf("%08b\n", x) //01111111
fmt.Printf("%08b\n", y) //00000110
fmt.Printf("%08b\n", x&^y) // 01111001
}
小结
和C/C++不同,Go的类型要求更为严格,int 型之间都不可以直接运算(如int8 和 int 32 不能直接运算),所以在使用整型的时候更推荐,使用有符号的类型因为库函数的返回值都是有符号的另外在数组中返回的负数值有其他意义。
浮点型
两种精度的浮点数,float32和float64,float32类型的浮点数可以提供大约6个十进制数的精度,而float64则可以提供约15个十进制数的精度,应该优先使用float64类型,因为float32类型的累计计算误差很容易扩散,并且float32能精确表示的正整数并不是很大(译注:因为float32的有效bit位只有23个,其它的bit位用于指数和符号;当整数大于23bit能表达的范围时,float32的表示将出现误差),打印的格式上Printf函数的%g参数打印浮点数,将采用更紧凑的表示形式打印,并提供足够的精度,但是对应表格的数据,使用%e(带指数)或%f的形式打印可能更合适。所有的这三个打印形式都可以指定打印的宽度和控制打印精度。
Math包
math包中除了提供大量常用的数学函数外,还提供了IEEE754浮点数标准中定义的特殊值的创建和测试:正无穷大和负无穷大,分别用于表示太大溢出的数字和除零的结果;还有NaN非数,一般用于表示无效的除法操作结果0/0或Sqrt(-1),math.IsNaN用于测试一个数是否是非数NaN,math.NaN则返回非数对应的值。虽然可以用math.NaN来表示一个非法的结果,但是测试一个结果是否是非数NaN则是充满风险的,因为NaN和任何数都是不相等的(译注:在浮点数中,NaN、正无穷大和负无穷大都不是唯一的,每个都有非常多种的bit模式表示)。
复数和布尔型
Go提供两种复数的精度,complex64和complex128,分别对应float32和float64两种浮点数精度。内置的complex函数用于构建复数,内建的real和imag函数分别返回复数的实部和虚部。
布尔型
和C/C++都要注意运算符的优先级和运算符短路的的问题。
字符串
和C/C++基础概念基本一样但是也有不同的地方,相同的是字符串是不可修改的,不可以越界访问字符串。字符串是包含的只读字节数组,一旦创建,是不可变的,不变性意味如果两个字符串共享相同的底层数据的话也是安全的,这使得复制任何长度的字符串代价是低廉的。同样,一个字符串s和对应的子字符串切片s[7:]的操作也可以安全地共享相同的内存,因此字符串切片操作代价也是低廉的。在这两种情况下都没有必要分配新的内存。
相关函数
len 函数可以返回一个字符串中的字节数目