Chapter 3
Basic Date Types
- basic types
- aggregate types
- arrays
- structs
- reference types
- pointers
- slices
- maps
- functions
- channels
- interface types
Integers
int
类型的细分int8
以及对应的无符号版本uint8
int16
int32
int64
byte
是unit8
的别名,rune
是int32
的别名. 虽然一般认为int
是32位的,但是int
和int32
是两种类型,并且需要显式的转换
- 模运算只能用于整数. 而对于负数来说结果的符号始终与被模数相同
-5%3
和-5%-3
的结果都是-2
- 除法运算当两个操作数均为整数时结果为整数(小数截断),否则为浮点数
&^
运算符(AND NOT)与非- 关于无符号整数。一般只用在比特运算或者某些特定场景中,而不会仅仅因为所表达的数据确实是非负的就使用,考虑如下例子其中数组的长度确实始终是非负的,但是
1
2
3
4medals := []string{"gold", "silver", "bronze"}
for i := len(medals) - 1; i >= 0; i-- {
fmt.Println(medals[i])
}len()
函数依然返回的是有符号整数而不是无符号整数。如果len()
函数返回的是无符号整数的话,那么i
也将是无符号整数,那么i >= 0
将永远为真,当i=0
时执行i--
将使得i
变为int
的最大值。
总之为了避免种种类似这种错误,避免在不必要的地方使用无符号整数
Floating-Point Numbers
- 关于
float32
和float64
,几乎不使用float32
,由于以下原因float32
一般来说会随着计算不断地积累误差float32
能够计算的最小不出现误差的整数其实也很小1
2var f float32 = 16777216 // 1 << 24
fmt.Println(f == f+1) // 为真float32
可以表示大概6位的精确十进制,而float64
为15位
- 与
NaN
的比较始终返回false
,所以不能直接与NaN
比较来判断,而需要使用math.IsNaN
1
2nan := math.NaN()
fmt.Prinln(nan == nan, nan < nan, nan > nan) // 均为false
Complex Numbers
Booleans
- 没有从数值变量到布尔变量的隐式转换(vice versa),所以需要手动写
if
来判断1
2
3
4i := 0
if b {
i = 1
}
Strings
string
类型的长度是由byte
数来决定的,而不是字符数,string
一般以UTF-8
进行编码,非ASCII
码字符可能会占用多个byte
,同样的对string
进行取下标操作所取得的也是byte
- 对
string
使用slice
操作(不知道是不是叫这个,就用Python里的叫法吧),得到的是一个对应范围的byte
所组成的新的字符串 - 可以使用Python中的省略slice起点和终点的语法
- 使用双引号
- Go中的一个字符被称为
rune
(好像是废话) - 对int使用string强制类型转换并不是将其转化为对应文字的字符串,而是对应值的字符如如果需要转化的话,使用
1
fmt.Println(string(65)) // "A" 而不是"65"
strconv
包 - 使用
rune
切片来获得以字符分割的数据,如r := []rune(s)
- 使用
Buufer.bytes
来构建字符串 - 常用转换函数
strconv.Itoa(123)
strconv.Atoi("123")
strconv.ParseInt("123", 10, 64)
十进制,最多64bit
Constants
- 声明一系列const值的时候,会发生值的顺延
1
2
3
4
5
6const (
a = 1
b // 顺延a的值
c = 2
d // 顺延c的值
) - 由上述性质产生了常量产生器(Constant Generator)
iota
其中1
2
3
4
5
6
7
8
9
10type Weekday int
const (
Sunday Weekday = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)Sunday
为0,之后的依次顺延
并且可以使用更加复杂的表达式,如1 << (10 * iota)
,每次计算的时候也是将iota
递增1 Go
中的字面常量实际上是一种无类型常量(Untyped Contants), 其具有更高的精度(可以认为至少有256位),并且有远超基本类型所能表示的数值范围和精度.如math.Pi
. 当字面常量被赋值给某个基本类型的时候实际上进行了隐式的类型转换,这就要求目标类型能够装得下数据