结构体指针
概念说明
结构体作为函数参数或方法接收者时,既可以按值传递,也可以用指针传递。
如果希望在函数/方法内部修改原结构体,通常需要使用结构体指针。
语法/规则
- 值参数(
Student)会复制一份数据,修改不会影响外部原值。 - 指针参数(
*Student)传的是地址,修改会影响外部原值。 - 值接收者方法(
func (s Student) ...)修改的是副本。 - 指针接收者方法(
func (s *Student) ...)可修改原结构体字段。 - 调用指针接收者方法时,Go 会自动帮你取地址(前提是可寻址值)。
函数参数示例(值参数 vs 指针参数)
| |
输出结果:
| |
方法接收者示例(值接收者 vs 指针接收者)
| |
输出结果:
| |
常见错误
- 希望修改原结构体却使用了值参数或值接收者,导致修改无效。
- 忘记区分“读场景”和“改场景”,所有方法都用值接收者或都用指针接收者。
- 对
nil结构体指针直接访问字段,可能触发运行时 panic。