在Go语言中,规范中写到:
我有以下代码:字符串是不可变的:一旦创建,就无法更改字符串的内容。
str := "hello"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // hello
ptr := &str
*ptr = "world"
fmt.Printf("%p\n",&str) // 0x1040c128
fmt.Printf("%v\n",str) // world
我本以为在执行 *ptr = "world"
后 &str
地址会发生变化,就像在Java中重新分配字符串引用一样。
这里的“不可变性”是指什么?
0x1040c128
),该位置保存两个值,即指向底层数组的指针和字符串的大小(与切片不同,字符串没有"容量"值,因为它们是不可变的,其容量始终等于其长度)。当你给一个字符串变量赋值时,实际上是改变了存储在该头部中的指针的值。头部本身的地址不会改变。 - Kaedys