Skip to content

基础语法与类型

变量/常量/iota、类型定义 vs 别名、new vs make、零值。

Updated View as Markdown
For humans

基础语法与类型

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 空 slicevar s []int(nil,len 0)vs s := []int{}(空,len 0)。JSON 序列化时 nil 变 null、空变 []
  • nil map 只读不写(读返回零值,写 panic)
  • nil 是有类型的(var p *int = nil),接口的 nil 陷阱见接口篇

面试追问

  1. new 和 make 的区别? new 返回零值指针(任意类型),make 只用于 slice/map/channel 且初始化内部结构
  2. 类型定义和别名? 定义是新类型(不兼容、可加方法),别名是换名(完全等价)。rune 是 int32 的别名
  3. iota 是什么? 常量计数器,每行 +1。枚举和位标志(1<<iota
  4. nil map 能写吗? 不能,写 panic。读返回零值。用 make 初始化
  5. nil slice 和空 slice? 都是 len 0,区别在 JSON 序列化(null vs [])和判空方式(s == nil vs len(s) == 0)
Navigation

Type to search…

↑↓ navigate↵ selectEsc close