指针传参,如果通过解引用获得原值后直接修改属性,则外层属性也会修改。这个很好理解。但为什么再赋值一次,就不是这样的结果呢?
有如下代码
package main
func main() {
person := Person{age: 10}
person2 := *(&person)
person2.age = 30
println(person.age)
println(person2.age)
println("======")
setAgeByPointer(&person)
println(person.age)
println("======")
setAge(&person)
println(person.age)
}
type Person struct {
age int
}
func setAgeByPointer(person *Person) {
person2 := *person
person2.age = 55
}
func setAge(person *Person) {
(*person).age = 55
}
最后的输出结果是这样
10
30
======
10
======
55
一个是
person2 := *person
person2.age = 55
另一个是 (*person).age = 55
为什么上面那个没有修改原值,下面修改了原值,我理解此时都直接修改了原内存地址里的值呀
person2 := *person
这行代码通过解引用person
得到一个新的Person
值,并赋给person2
。此时person2
是person
的一个副本,任何对person2
的修改都不会影响person
。(*person).age = 55
这行代码通过指针修改了person
的age
。由于这里是直接操作指向原始数据的内存地址,因此修改会反映到原始对象上。在 Go 语言中,所有的参数传递都是通过值传递的方式进行的,都是传递副本。
关于指针和解引用赋值的行为不要混淆。