首页 > 编程知识 正文

golang 赋值,golang 赋值 原子性

时间:2023-05-05 12:22:03 阅读:191018 作者:343

1. 写在前面

我们知道Golang在调用方法时,会自动对实参进行“取引用”或“解引用”操作。我们在前面的博客Golang对方法接收者变量的自动“取引用”和“解引用”中也已经讨论了容易引起混淆的解/取引用和接口相关的知识,这里我们将讨论另一个问题:“自动取引用”和“自动解引用”会不会对原值产生影响。
我们知道这样一个规则:

规则1: 当传递给方法的实参是一个值类型时,原值的内容不会受到影响,因为传递进来的是原值的副本;相反,当传递给方法的实参是一个指针类型时,原值的内容将可能受到影响。

但本文讨论一个比较特殊的情况是:“自动解引用”时receive会从指针类型转变为值类型,而“自动取引用”时receiver会从值类型转变为指针类型,这是否会对规则1产生影响。

2. 实验验证

我们还是用代码来说明问题。demo1.go分别演示了四种情形:

值类型的实参调用形参为值类型的方法用指针类型的实参调用形参为值类型的方法(会进行“自动解引用”)用值类型的实参调用形参为指针类型的方法(会进行“自动取引用”)用指针类型的实参调用形参为指针类型的方法 //demo1.gopackage mainimport "fmt"// user defines a user in the program.type user struct {email string}// changeEmailByValue implements a method with a value receiver.func (u user) changeEmailByValue(email string) {u.email = email}// changeEmailByPointer implements a method with a pointer receiver.func (u *user) changeEmailByPointer(email string) {u.email = email}func main() {傻傻的啤酒 := user{"傻傻的啤酒@163.com"} // value typefmt.Printf("要减肥的黄蜂's original email:%sn", 傻傻的啤酒.email)傻傻的啤酒.changeEmailByValue("傻傻的啤酒@gmail.com")fmt.Printf("ChangeEmailByValue with a value type: %sn", 傻傻的啤酒.email)bob := &(user{"bob@163.com"}) // pointer typefmt.Printf("Bob's original email:%sn", bob.email)bob.changeEmailByValue("bob@gmail.com")fmt.Printf("ChangeEmailByValue with a pointer type: %sn", bob.email)nrdfj := user{"nrdfj@163.com"} // value typefmt.Printf("大方的皮卡丘's original email:%sn", nrdfj.email)nrdfj.changeEmailByPointer("nrdfj@gmail.com")fmt.Printf("ChangeEmailByPointer with a value type: %sn", nrdfj.email)dave := &(user{"dave@163.com"}) // pointer typefmt.Printf("Dave's original email:%sn", dave.email)dave.changeEmailByPointer("dave@gmail.com")fmt.Printf("ChangeEmailByPointer with a pointer type: %sn", dave.email)}

代码运行结果如下图所示

3. 小结

从运行结果可以发现,“自动解引用”和“自动取引用”都不会改变规则1,方法的调用是否会对原值产生影响完全取决于该方法的形参是值类型还是参数类型

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。