GO语言基础教程(115)Go方法之值接收者方法:别再让Go方法偷偷拷贝你的数据!值接收者那些事儿

以为在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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

值引力

持续创作,多谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值