【发布时间】:2016-08-11 18:25:42
【问题描述】:
有谁能解释一下为什么&c1.name的地址在函数changeMe()中更改后是一样的。我认为字符串在 Go 中是不可变的。
package main
import "fmt"
type customer struct {
name string
age int
}
func main() {
c1 := customer{"Todd", 44}
fmt.Println(&c1.name) // 0x8201e4120
changeMe(&c1)
fmt.Println(c1) // {Rocky 44}
fmt.Println(&c1.name) // 0x8201e4120
}
func changeMe(z *customer) {
fmt.Println(z) // &{Todd 44}
fmt.Println(&z.name) // 0x8201e4120
z.name = "Rocky"
fmt.Println(z) // &{Rocky 44}
fmt.Println(&z.name) // 0x8201e4120
}
【问题讨论】:
-
因为
c1是唯一的实例,它的地址不会改变,你只能改变它的值 -
是的,
c1没有被更改,但它的字段name是不可变的,对吧?所以当我改变name它应该有新的地址。如果我想存储非常大的字符串,编译器如何存储它,当它仍然使用相同的地址时?
标签: string pointers go immutability