Go基本类型包括bool、string及数值类预声明类型(如int、uint32、float32、complex64、rune、byte),其中rune是int32别名,byte是uint8别名;map、slice、chan为派生类型,需make初始化;interface{}可存任意类型但需断言;type alias与definition语义不同。

bool、int、float64、string、rune、byte 这些是 Go 里最常直接写的类型;但别误以为它们是“全部”——Go 的数据类型分基本类型和派生类型,真正写代码时绕不开的是后者。
哪些类型属于基本类型(predeclared)
Go 规范里明确定义了 bool、string 和数值类(如 int、int8、uint32、float32、complex64、rune、byte)为预声明类型。其中:
-
rune是int32的别名,专用于表示 Unicode 码点,不是“字符类型”的泛称 -
byte是uint8的别名,仅用于字节操作,比如读文件或网络包 -
int和uint的实际宽度依赖平台(32 或 64 位),跨平台代码里慎用作序列化或二进制协议字段 - 没有
char类型;单引号括起来的'a'是rune字面量,不是 C 风格的字符
map、slice、chan 这些为什么不能算“基本类型”
它们是派生类型(derived types),底层由运行时动态管理,声明时必须带元素类型,例如:
var m map[string]int var s []float64 var c chan bool
常见错误包括:
- 声明后直接赋值:<code>m["key"] = 1</code> 会 panic —— 必须先
make(map[string]int) -
slice零值是nil,但len(s) == 0和s == nil不等价;判空建议用len(s) == 0,而非s == nil -
chan未初始化时也是nil,对nil chan的发送/接收会永远阻塞(不是 panic)
指针和 struct 在类型系统里的特殊性
Go 没有“引用传递”,所有传参都是值拷贝,但 *T 和 struct 行为差异极大:
立即学习“go语言免费学习笔记(深入)”;
- 传
struct值:整个结构体被拷贝,字段多时开销明显;传*struct:只拷贝指针(8 字节) - 嵌套 struct 中含 slice/map/chan 字段时,即使传值,这些字段仍共享底层数组或哈希表 —— 这不是“引用”,而是派生类型的固有特性
-
new(T)返回*T且初始化为零值;&T{}效果类似,但更常用;二者都不等价于make
interface{} 和 type alias 容易被忽略的细节
interface{} 是空接口,能存任意类型,但取出来必须类型断言:
v := interface{}(42)
i := v.(int) // ok
s := v.(string) // panic: interface conversion: interface {} is int, not string
而 type alias(如 type MyInt = int)和 type definition(type MyInt int)语义完全不同:
- alias 与原类型完全兼容,可直接赋值、传参、比较
- definition 创建新类型,哪怕底层一样,也不能直接赋值,需显式转换
- 定义 method 时,只有 definition 能给新类型加方法;alias 不能加新方法
[]byte 和 string 之间能强制转换,但转换开销是 O(n),且 string 不可变、[]byte 可变——这个细节在字符串拼接或协议解析里经常引发 bug。


















