外观
Go 类型、指针与值传递
- 状态:未准备
- 适用方向:Go 全栈 / Go 后端
- 最近复习:待填写
- 下次复习:待安排
一句话回答
Go 参数一律按值传递;复制指针或切片等值后,仍可能访问同一底层对象,不能说成“按引用传参”。
原理解释
- 数组和结构体赋值复制值;字段若包含指针,副本仍可共享被指向的数据,值拷贝不等于深拷贝。
new(T)返回指向零值 T 的指针;make初始化 slice、map、channel 并返回对应类型的值。&、new不单独决定分配位置,栈或堆由编译器和逃逸分析决定。type UserID int64定义新类型,type UserID = int64是别名;前者有助于区分业务 ID。- 指针、slice、map、channel、函数和接口的零值为 nil;结构体逐字段取零值。
go
func replace(p *int) { n := 9; p = &n }
func update(p *int) { *p = 9 }
// x := 1; replace(&x) 后 x 仍为 1;update(&x) 后 x 为 9。场景与边界
需要修改对象或避免大对象复制时可用指针,但要考虑共享写入和生命周期。包含锁的结构体开始使用后不能随意复制。小型不可变配置可优先值传递。
项目中的应用
沿 SimulSpeak 后端材料核对会话状态和 provider 参数:哪些只是值副本,哪些共享可变对象;这是阅读任务,不代表已完成改造。
常见追问
- 传 map 为什么能改数据? 副本仍关联同一映射;把形参赋成另一张 map 不会替换调用方变量。
- 指针一定更快吗? 不一定,间接寻址、逃逸和 GC 也有成本,需基准测试。
- 能返回局部变量地址吗? 可以,Go 保证有效生命周期,编译器按需安排存储。