以为在Go里调用方法就能改变对象?小心,你的数据可能正在被悄悄复制!
什么是方法?先来点基础的
在Go语言中,方法是绑定到特定类型上的函数。与普通函数不同,方法具有一个"接收者",用于指定它是哪个类型的方法。
简单说,方法就是某个类型的"专属技能",只有这个类型的变量才能调用它。
type Person struct {
Name string
Age int
}
// 这是一个方法:SayHello
func (p Person) SayHello() {
fmt.Printf("Hello, my name is %s and I am %d years old.\n", p.Name, p.Age)
}
上面代码中,SayHello就是Person类型的专属技能,任何Person类型的变量都可以调用它来介绍自己。
值接收者 vs 指针接收者:核心区别
值接收者 - 小心翼翼的工作者
值接收者方法接收的是原始数据的副本,而不是原始数据本身。这意味着它在工作时非常小心,绝对不会碰你的原始数据。
func (p Person) SetName(name string) {
p.Name = name // 改的是副本,原始对象不变
}
当调用这个方法时,Go会创建原Person的一个完整副本,方法内所有操作都作用于这个副本上。
指针接收者 - 直接操作的大胆家伙
指针接收者方法接收的是原始数据的内存地址,它直接操作原始数据,任何修改都会影响原对象。
func (p *Person) UpdateAge(age int) {
p.Age = age // 修改的是原始对象
}
值接收者的工作原理解密
值接收者方法的工作原理可以用一个简单比喻理解:就像你有一份重要文件,但你不是直接在上面修改,而是先复印一份,然后在复印件上做修改。无论你在复印件上怎么涂改,原始文件都完好无损。
让我们通过一个完整示例看看值接收者的实际行为:
package main
import "fmt"
type BankAccount struct {
Owner string
Balance float64
}
// 值接收者方法:尝试存款
func (b BankAccount) Deposit(amount float64) {
b.Balance += amount
fmt.Printf("存款方法内:%s 的账户余额为 %.2f\n", b.Owner, b.Balance)
}
// 值接收者方法:查看余额
func (b BankAccount) CheckBalance() {
fmt.Printf("余额查询:%s 的账户余额为 %.2f\n", b.Owner, b.Balance)
}
func main() {
account := BankAccount{
Owner: "小明",
Balance: 1000.0,
}
fmt.Println("=== 值接收者方法演示 ===")
fmt.Printf("初始状态:%s 的账户余额为 %.2f\n", account.Owner, account.Balance)
// 尝试存款
account.Deposit(500.0)
// 检查实际余额
fmt.Printf("最终状态:%s 的账户余额为 %.2f\n", account.Owner, account.Balance)
// 再看一次余额
account.Check

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



