贝利信息

Golang结构体指针和值类型有什么区别_选择正确数据类型方法

日期:2026-01-25 00:00 / 作者:P粉602998670
结构体传值无法修改原数据,传指针可以;小结构体且只读宜传值,需修改或较大时宜传指针;接收者类型影响接口实现与方法集;字段用*string仅当需区分nil与"";优先值类型,除非实测拷贝成瓶颈。

结构体传值 vs 传指针:函数参数里改不改得动原数据

核心就一条:func (s Student) SetAge(a int) 改不动原始 Studentfunc (s *Student) SetAge(a int) 能改。因为前者拿到的是副本,后者拿到的是地址。

方法接收者混用会导致接口实现失效

Go 的接口匹配规则很严格:如果一个接口方法是用 *User 接收者实现的,那只有 *User 类型才满足该接口,User 值类型不满足。

结构体字段里该用 *string 还是 string?看语义,不是看大小

字段是否用指针,和“能不能改”无关,而和“要不要表达‘未设置’状态”有关。

性能不是唯一标准,逃逸和 GC 压力常被低估

很多人以为“结构体大就一定传指针”,但实际中,频繁取地址再返回指针,可能让本该在栈上的小对象被迫逃逸到堆,反而加重 GC 压力。

最常被忽略的其实是语义一致性:同一个结构体,有的方法改字段,有的只读,却混用值/指针接收者——这不是语法错误,但会让调用方无法预测行为,也埋下接口匹配隐患。