基础语法与类型
Go 语法精简,考点集中在类型系统的几个易混点:类型定义 vs 别名、new vs make、零值语义。
变量与常量
var x int = 1 // 显式
y := 2 // 短声明(类型推断)
const (
A = iota // 0
B // 1
C // 2
):=只能在函数内,var包内可用- iota:常量计数器,每行自动 +1,用于枚举和位标志
- Go 的变量声明后必须使用(未用变量编译报错,防垃圾代码)
类型定义 vs 类型别名
type MyInt int // 类型定义: 新类型, 方法可绑定, 与 int 不直接兼容
type Alias = int // 类型别名: 就是 int 的另一个名字, 完全等价| 维度 | type A B(定义) |
type A = B(别名) |
|---|---|---|
| 本质 | 新类型 | 同类型换名 |
| 赋值兼容 | 需要显式转换 | 完全兼容 |
| 方法 | 可定义新方法 | 沿用原类型 |
| 用途 | 语义区分(如 UserID) | 兼容重构(如 rune = int32) |
考点:定义是新类型(强语义),别名是换名字(兼容性)。
new vs make ★
| 维度 | new(T) | make(T) |
|---|---|---|
| 适用 | 任意类型 | 仅 slice/map/channel |
| 返回 | *T(指向零值) | T(已初始化结构) |
| 初始化 | 只分配零值内存 | 分配 + 初始化内部结构 |
p := new(int) // *int, 指向 0
s := make([]int, 3) // 切片: 已分配底层数组
m := make(map[string]int) // map: 已初始化 hmap核心区别:slice/map/channel 是引用结构,make 才初始化内部结构;var m map[string]int 是 nil map,写入 panic。new 基本只用于取指针。
零值与空
- 零值:声明即初始化(int 0、string “”、指针 nil、slice nil、map nil)
- nil slice vs 空 slice:
var s []int(nil,len 0)vss := []int{}(空,len 0)。JSON 序列化时 nil 变 null、空变 [] - nil map 只读不写(读返回零值,写 panic)
- nil 是有类型的(
var p *int = nil),接口的 nil 陷阱见接口篇
面试追问
- new 和 make 的区别? new 返回零值指针(任意类型),make 只用于 slice/map/channel 且初始化内部结构
- 类型定义和别名? 定义是新类型(不兼容、可加方法),别名是换名(完全等价)。rune 是 int32 的别名
- iota 是什么? 常量计数器,每行 +1。枚举和位标志(
1<<iota) - nil map 能写吗? 不能,写 panic。读返回零值。用 make 初始化
- nil slice 和空 slice? 都是 len 0,区别在 JSON 序列化(null vs [])和判空方式(s == nil vs len(s) == 0)