3.1 整型

类型

有符号:int8int16int32int64;无符号:uint8uint16uint32uint64intuint 大小随平台(32 或 64 bit)。rune 等价 int32(Unicode 码点),byte 等价 uint8(原始数据),uintptr 用于存放指针。

不同整数类型间不能直接运算,需显式转换:int(apples) + int(oranges)

运算符(优先级从高到低)

*  /  %  <<  >>  &  &^
+  -  |  ^
== != <  <= >  >=
&&
||

% 取模结果符号与被除数一致。整数 / 向零截断。溢出时高位丢弃。

位运算

&(AND)、|(OR)、^(XOR / 一元取反)、&^(AND NOT,按位清零)、<<(左移)、>>(右移)。

x := uint8(1<<1 | 1<<5) // 00100010
y := uint8(1<<1 | 1<<2) // 00000110
fmt.Printf("%08b\n", x&y)  // 00000010 交集
fmt.Printf("%08b\n", x|y)  // 00100110 并集
fmt.Printf("%08b\n", x^y)  // 00100100 对称差
fmt.Printf("%08b\n", x&^y) // 00100000 差集

进制与格式化

八进制 0666,十六进制 0xdeadbeef%d 十进制、%o 八进制、%x 十六进制、%c 字符、%q 带引号字符。

o := 0666
fmt.Printf("%d %[1]o %#[1]o\n", o) // 438 666 0666

使用建议

即使值不会为负,一般也优先用 int 而非 uint,避免 i >= 0 永真导致的死循环。uint 仅在位运算、哈希等场景使用。


来源:Go 语言圣经 - 3.1 整型