变量默认零值且赋值为值拷贝,指针仅支持地址引用无算术运算,接口是(type,data)二元组并隐式实现;三者共同构成go内存模型与类型系统核心。

变量、指针和接口是 Go 语言最核心的三个基础概念,理解它们的底层行为和设计意图,比死记语法更重要。很多面试题表面考写法,实际在检验你是否真正“看懂”了 Go 的内存模型和类型系统。
变量:值语义 + 隐式初始化
Go 中所有变量都默认初始化为对应类型的零值(不是 nil,而是 0、""、false、nil 等具体零值),且赋值是**值拷贝**——结构体、数组、切片底层数组头、map/slice/chan/func/interface 类型变量本身都是轻量级描述符,拷贝的是它们的“头信息”,不是背后数据。
- 结构体赋值是深拷贝字段(但字段若为 slice/map/ptr,则只拷贝其头)
- 切片赋值拷贝的是 len/cap/ptr 三元组,新旧切片共享底层数组
- 函数参数永远是传值;想修改原 slice 内容,要传 *[]T 或直接返回新 slice
指针:显式地址操作,但无指针运算
Go 的指针是纯粹的地址引用,不支持算术运算(如 p++)、不支持多级间接(如 **int 不合法),主要用途是:避免大对象拷贝、实现可变性、配合 new/make 初始化、满足接口要求。
- new(T) 返回 *T,分配零值内存并返回地址;make 只用于 slice/map/channel,返回 T(非指针)
- & 只能取“可寻址对象”的地址(变量、结构体字段、slice 索引元素等),不能对字面量或函数调用结果取地址
- nil 指针解引用会 panic;安全做法是先判空再使用,尤其在方法接收者为 *T 时
接口:隐式实现 + 动态调度
接口本质是两个字长的结构体:类型信息(type) + 数据指针(data)。只要类型实现了接口所有方法(签名一致),就自动满足该接口,无需显式声明。
立即学习“go语言免费学习笔记(深入)”;
- 空接口 interface{} 可存任意类型,底层是 (type, data),类型断言或反射才能还原
- 接口变量本身为 nil,当且仅当 type 和 data 都为 nil;注意:*T 类型变量为 nil 时,赋给接口后接口不为 nil(type 存在)
- 接口方法调用通过动态查找(itable)完成,有微小开销;高频路径避免不必要的接口包装
掌握这三者的组合行为,比如 “为什么 *os.File 能赋给 io.Reader 接口?”、“为什么 struct{}{} 作为 map value 很省内存?”、“为什么 defer 中的指针参数可能看到修改后的值?”,才算真正入门 Go 的运行时逻辑。










