讲解
Go 的基本类型分几族:整数(int、int8、int16、int32、int64 及对应的无符号 uint 系列,还有与平台一致的 int/uint)、浮点数(float32、float64)、布尔(bool)和字符串(string,下一章专门讲)。日常写代码用 int、float64、bool 就够了,只有在对内存或协议格式有明确要求时才用定长类型。
Go 不做隐式类型转换:int 和 float64 不能直接相加,必须显式写 float64(i)。这条规则让类型错误在编译期就暴露,避免了很多语言里「字符串拼接变加法」之类的灵异 bug。转换的写法是类型名加括号:int(3.99) 得 3——注意浮点转整数是直接截断,不是四舍五入。
运算符和其他语言大同小异:算术 + - * / %,比较 == != > >= < <=,逻辑 && || !,位运算 & | ^ << >>,复合赋值 += -= 等。两个要点:整数的 / 是整除(7/2 得 3),要小数结果得用浮点数;自增 x++ 是「语句」而不是表达式,不能写 fmt.Println(x++),也没有 ++x 的前置形式。
示例
基本类型与显式转换:
package main
import "fmt"
func main() {
var i int = 42
var i64 int64 = 9000000000
var u uint8 = 255
var f float64 = 3.14
var b bool = true
fmt.Println(i, i64, u, f, b)
// 不同类型之间必须显式转换
sum := float64(i) + f
fmt.Println("显式转换后相加:", sum)
}
整除、取余与截断转换:
package main
import "fmt"
func main() {
fmt.Println("整数除法:", 7/2) // 3,不是 3.5
fmt.Println("取余:", 7%2) // 1
fmt.Println("浮点除法:", 7.0/2.0) // 3.5
pi := 3.99
fmt.Println("float64 转 int 直接截断:", int(pi)) // 3
}
算术、比较与位运算一览:
package main
import "fmt"
func main() {
a, b := 10, 3
fmt.Println(a+b, a-b, a*b, a/b, a%b)
fmt.Println(a > b, a == b, a != b)
x := 5
x += 2 // 复合赋值
x++ // 自增是语句,不能写进表达式
fmt.Println("x =", x)
fmt.Printf("5 & 3 = %d, 5 | 3 = %d, 5 ^ 3 = %d\n", 5&3, 5|3, 5^3)
fmt.Println("1 左移两位:", 1<<2, "8 右移一位:", 8>>1)
}
常见坑
- 期待整数除法出小数:7/2 在 Go 里是 3。要 3.5 就写成 7.0/2.0,或先转成 float64 再除。计算平均值时这是高频 bug。
- 浮点转整数以为会四舍五入:int(3.99) 是 3,小数部分直接丢弃。需要四舍五入用 math.Round。
- 依赖 int 的位数:int 在 64 位平台是 64 位、32 位平台是 32 位。跨平台程序里如果位数重要,显式用 int64。
- 把 x++ 当表达式:Go 里 ++ 是语句,newX := x++ 是语法错误。先 x++ 再用 x,语义反而更清晰。
- 整数溢出悄无声息:uint8 最大 255,再加 1 会绕回 0,编译器不报错。处理可能超界的数值时选足够大的类型,或用 math/bits 检查。
小结
整数、浮点、布尔各司其职,类型转换必须显式,整除截断、浮点转 int 也截断。下一节学习常量与 Go 特有的枚举工具 iota。