Go的基本数据类型仅有五类:bool、整数类(如int、uint8、int32等)、float32/float64、complex64/complex128、string;byte和rune是别名,error是接口,均不属于基本类型。

Go里哪些类型算“基本数据类型”?
Go语言中,真正属于基本数据类型(primitive types)的只有五类:bool、整数类(如int、uint8、int32等)、float32/float64、complex64/complex128、string。
注意:byte和rune只是别名(byte = uint8,rune = int32),不算新类型;error是接口,属于复合类型。
- 基本类型是值语义:赋值、传参都拷贝整个值
- 它们不能嵌套自身,也不能直接持有引用
- 所有基本类型都有确定的零值:
0、false、""
为什么int和int32不能混用?编译器报错怎么解?
因为Go不支持任何隐式类型转换——哪怕int在当前系统确实是32位,它和int32仍是两个完全不同的类型。
常见错误现象:
var x int = 42 var y int32 = x // 编译错误:cannot use x (type int) as type int32 in assignment
实操建议:
- 必须显式转换:
y = int32(x) - 转换前确认范围安全:比如
int64转int8可能溢出,但编译器不检查,运行时静默截断 - 函数参数/返回值类型要严格匹配,例如
os.OpenFile第三个参数是os.FileMode(本质是uint32),传0644就得写os.FileMode(0644)
字符串不可改,想改第一个字节怎么办?
string在Go中是只读的字节序列(UTF-8编码),底层是只读数组。直接写s[0] = 'X'会编译失败。
立即学习“go语言免费学习笔记(深入)”;
使用场景:
初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
- 修改内容(比如把"hello"变成"jello")
- 截取中文字符(
"你好"[0]拿到的是UTF-8首字节,不是字符)
实操建议:
- 改字节:先转
[]byte,改完再转回strings := "hello"; b := []byte(s); b[0] = 'j'; s = string(b) - 处理Unicode字符(如中文):用
[]runer := []rune("你好"); r[0] = '您'; s = string(r) - 切忌对
string做unsafe强转修改:破坏内存安全,且Go 1.22+已限制部分操作
float64 == 0.3 为什么总是false?
浮点数在二进制中无法精确表示十进制小数,0.1 + 0.2实际存储的是近似值,与字面量0.3的近似值并不相等。
常见错误现象:
fmt.Println(0.1+0.2 == 0.3) // 输出 false
实操建议:
- 比较用误差容忍(epsilon):
math.Abs(a-b) < 1e-9 - 不要用
==判相等,尤其在测试或条件分支中 - 钱币计算别用
float64:改用int64存“分”,或引入github.com/shopspring/decimal - 注意
NaN:任何值(包括自己)跟NaN比都为false,得用math.IsNaN(x)判断
Go的基本类型设计很“直给”,但正因如此,越基础的地方越容易掉坑——类型不兼容、字符串误改、浮点比较失准,全都是编译能过、运行出错、逻辑难查的典型。别指望编译器替你猜意图,它只认字面定义。

















