有人能解释一下为什么在 changeMe()
函数中改变 &c1.name
的地址后,它的地址还是保持不变吗?我认为在 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
是一个唯一的实例,它的地址不会改变,所以你只能改变它的值。 - simon_xiac1
没有被改变,但它的字段name
是不可变的,对吧?所以当我改变name
时,它应该有新的地址。如果我想存储非常大的字符串,编译器会如何存储它,当它仍然使用相同的地址? - camabeh