go语言必须记住的五个基本类型是:bool、string、int系列(int8/int16/int32/int64/int及对应uint)、float32/float64、rune;它们均为静态确定类型,无隐式转换,与map/slice/chan等引用类型有本质区别。

Go 语言的数据类型分两类:基本类型(built-in)和派生类型(composite),没有“类”或“对象”这种动态类型概念,所有变量声明即绑定确定类型,改不了。
哪些是必须记住的基本类型?
日常写代码最常打交道的就这五个:
-
bool:只接受true或false,不能和1/0互转,if x { }里x必须是bool,传int直接编译报错 -
string:底层是只读字节序列([]byte),UTF-8 编码,len(s)返回字节数不是字符数;中文字符占 3 字节,别用len()当“长度”来切片 -
int系列:int8、int16、int32、int64、int(平台相关,64 位机通常是 64 位),uint同理;int和int64不兼容,混用要显式转换 -
float32/float64:没有float这种裸类型;3.14字面量默认是float64,赋给float32变量会警告精度损失 -
rune:不是“字符类型”,而是int32的别名,专用于表示 Unicode 码点(比如一个中文字符);for range s遍历的是rune,不是字节
map、slice、chan 这些为什么不算“基本类型”?
因为它们是引用类型(底层有头结构 + 指针),行为和基本类型完全不同:
-
map是哈希表,零值是nil,直接m["k"] = v会 panic;必须先make(map[string]int) -
slice是动态数组视图,len和cap分开看;s[1:3]超出cap会 panic,但超出len只是截短(只要不越 cap) -
chan是带缓冲/无缓冲的通信管道,零值是nil,对nil chan发送或接收会永远阻塞;select中nil chan会被忽略 - 三者都支持
==判断是否为nil,但彼此之间不能用==比较内容(map和slice甚至不允许直接比较)
容易踩坑的隐式类型陷阱
Go 不做任何隐式转换,看着像,其实类型不同,一碰就报错:
-
byte是uint8别名,int8和byte不能混用——fmt.Printf("%c", byte(97))行,fmt.Printf("%c", int8(97))就不行 -
uintptr是用来存指针地址的整数,和uint不兼容;想把指针转成整数再转回来,只能用uintptr,且不能参与算术(防止 GC 误判) - 函数参数是
[]int,你传[3]int会报错——数组长度是类型的一部分,[3]int和[4]int是完全不同的类型 - JSON 解码时,
json.Unmarshal默认把数字解成float64,即使源数据是123;想保持整数,得用json.Number或提前定义字段为int64
类型系统不是约束,是提示。当你看到 cannot use ... as ... in assignment,别急着加 int(x),先确认语义上它**本该是什么类型**——很多 bug 其实是设计偏差,不是语法绕不过去。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











