Go有五类基本类型:bool、整数类、float、complex、string;byte/rune是别名,error是接口;int与int32因无隐式转换且类型独立而不可混用;string只读,修改需转[]byte或[]rune;遍历应使用range。

Go 里只有五类基本数据类型:bool、整数类(int/int32/uint8 等)、float32/float64、complex64/complex128、string。byte 和 rune 是别名,error 是接口,都不算基本类型。
为什么 int 和 int32 不能混用?
因为 Go 完全禁止隐式类型转换——哪怕在 amd64 上 int 实际是 int64,它和 int32 仍是两个独立类型,编译器直接报错。
- 常见错误:
var x int = 42; var y int32 = x→cannot use x (type int) as type int32 in assignment - 必须显式转换:
y = int32(x),但要注意溢出:比如int64(10000000000)转int8会静默截断为 -24 - 标准库中高频踩坑点:
os.OpenFile第三个参数是os.FileMode(本质uint32),传0644会失败,得写成os.FileMode(0644)
string 修改第一个字节为什么编译失败?
string 是只读的 UTF-8 字节序列,底层结构不允许写入。直接写 s[0] = 'X' 会触发编译错误,不是运行时 panic。
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
- 想改 ASCII 内容(如 "hello" → "jello"):
b := []byte(s); b[0] = 'j'; s = string(b) - 想改中文或 emoji(如 "你好" → "您好"):
r := []rune(s); r[0] = '您'; s = string(r),否则按字节索引会切坏 UTF-8 编码 - 遍历字符请用
for _, r := range s,别用for i := 0; i ——后者遍历的是字节,不是字符
float64 == 0.3 为什么总是 false?
浮点数在二进制中无法精确表示十进制小数,0.1 + 0.2 存储的是一个近似值,与字面量 0.3 的近似值不相等。这不是 Go 的 bug,而是 IEEE 754 标准的必然结果。
立即学习“go语言免费学习笔记(深入)”;
- 永远别用
==比较浮点数,包括测试断言;改用误差容忍:math.Abs(a-b) - 金融计算必须避开 float:存“分”用
int64,或引入github.com/shopspring/decimal -
float32精度仅约 6–7 位十进制,图像批量处理可选;其他场景默认用float64 - 注意 NaN:
math.NaN() == math.NaN()是false,得用math.IsNaN(x)判断
最容易被忽略的其实是零值语义:声明未赋值的 int 就是 0,string 就是 "",它们无法区分“用户没填”和“用户明确填了空值”。真要表达“未设置”,得用 *int 或自定义带状态的类型。

















