go的基本数据类型是编译期强制校验的契约,类型错误直接报错;bool仅支持true/false字面量且不可隐式转换;数值类型须显式区分有符号/无符号及位宽;string不可变且与[]byte内存布局不同;所有变量声明即初始化为确定零值。

Go 的基本数据类型不是“记住就行”的语法点,而是编译期强制校验的契约——写错类型,go build 直接报错,没商量。
bool 类型不能和数字互转,连 cast 都不被允许
很多人从其他语言转过来,习惯性写 bool(1) 或 int(true),Go 会立刻报 cannot convert … to type bool。这不是限制,是设计选择:避免隐式真假歧义(比如 0=false、非0=true 这类规则在 Go 里根本不存在)。
-
true和false是唯一合法字面量,不能用整数、字符串、指针等任何其他类型赋值 - 条件表达式结果才是 bool:比如
a > b、len(s) == 0、err != nil,这些表达式本身返回bool,可直接用于if或赋给bool变量 - 函数返回
bool时,必须显式返回true或false,不能靠“非零即真”这类逻辑
数值类型必须显式区分有符号/无符号、位宽
Go 不提供“通用整数”类型,int 虽常用,但它的大小依赖平台(32 或 64 位),而 int32 和 int64 是完全不同的类型,不能混用。
- 接口传参或 map key 中若用
int,在不同架构下行为可能不一致;跨服务或序列化场景推荐固定位宽类型,如int64 -
byte是uint8的别名,rune是int32的别名——它们不是“新类型”,只是语义标签,但类型检查严格,byte和uint8可互换,但byte和int8不行 -
float32和float64不兼容:即使值相同,float32(3.14)不能直接赋给float64变量,必须显式转换:float64(f32)
string 是只读字节序列,底层不等于 []byte
string 在 Go 中是不可变的只读类型,底层结构包含指向字节数组的指针 + 长度,但没有容量字段;[]byte 是切片,可读写、可扩容。两者内存布局不同,不能直接类型转换(虽然可以用 []byte(s) 和 string(b) 转换,但每次都会复制数据)。
- 频繁修改字符串?别用
string +=,它每次拼接都新建底层数组,性能差;改用strings.Builder或预分配[]byte -
string字面量默认 UTF-8 编码,单个中文字符占 3 字节,len("你好")返回 6,不是 2;要按字符数算,得用utf8.RuneCountInString() - 函数参数接收
string时,传入[]byte会编译失败;需要转换时,明确写出string(b),让调用者意识到有拷贝开销
零值不是“空”,而是类型定义的默认状态
Go 没有 null,所有变量声明后自动初始化为该类型的零值:0、""、false、nil(对 slice/map/chan/func/pointer/interface)。这个特性简化了初始化逻辑,但也容易掩盖未显式赋值的 bug。
-
var s string→s == ""为 true,但""和未初始化不是一回事,它是确定的、可比较的值 -
var m map[string]int得到的是nilmap,此时len(m)是 0,但m["k"] = 1会 panic;必须先m = make(map[string]int) - 结构体字段也遵循零值规则,嵌套结构体字段若未显式初始化,其内部字段仍是各自类型的零值,不是“未定义”
真正难的不是记住每个类型的取值范围,而是理解:类型系统在编译期就锁死了内存布局和操作边界,任何越界、隐式转换、未初始化访问,都不会等到运行时才发现。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











