

新闻资讯
技术学院在 go 中,方法接收者前加 `*` 表示该方法作用于结构体指针,操作的是原始数据;不加 `*` 则作用于结构体副本,修改不会影响原值。虽然只读操作效果相同,但涉及字段修改、性能优化或接口实现时,二者行为截然不同。
在 Go 的面向对象设计中,“接收者”(receiver)决定了方法是绑定到值还是指针。以 func (h *Human) SayHi() 为例,*Human 表示该方法只能被 *Human 类型(即 Human 指针)调用;而 func (h Human) SayHi() 则绑定到 Human 值类型,每次调用都会复制整个结构体。
下面通过一个明确的对比示例说明:
func (h *Human) UpdateName(newName string) {
h.name = newName // ✅ 修改成功:作用于原始结构体
}
func (h Human) TryUpdateName(newName string) {
h.name = newName // ❌ 无效:仅修改副本,原值不变
}完整验证代码:
package main
import "fmt"
type Human struct {
name string
age int
}
func (h *Human) UpdateNamePtr(newName string) {
h.name = newName
}
func (h Human) UpdateNameVal(newName string) {
h.name = newName // 编译通过,但无实际效果
}
func main() {
person := Human{name: "Alice", age: 30}
fmt.Printf("Before: %+v\n", person) // {name:Alice age:30}
person.UpdateNamePtr("Bob") // ✅ 成功更新
fmt.Printf("After ptr-call: %+v\n", person) // {name:Bob age:30}
person.UpdateNameVal("Charlie") // ❌ 无影响
fmt.P
rintf("After val-call: %+v\n", person) // {name:Bob age:30} — 仍是 Bob
}简言之:* 不是语法装饰,而是 Go 显式区分“操作本体”与“操作副本”的核心机制——理解它,是写出可维护、高性能 Go 代码的第一步。