讲解

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。