```go
s := "foobar阿斯蒂芬"
fmt.Println(s)
fmt.Println(&s)
s = "qweqweqweqweqwe"
fmt.Println(s)
fmt.Println(&s)
```
这个不可变到底指的是啥意思?上面的代码不就使s这个string变量改变了吗?而且s的地址也没有变化(说明没有给s重新分配内存),那这样看来,s就是可变的呀,实在不懂,求解惑
Go的字符串也是引用类型,它类似切片,也包含一个指针字段,该字段指向它引用的字节系列的数组[]byte;
你改变一个字符串变量的值,只是改变指针字段的指向,指向新的值转化而来的字节数组,原来的字节数组并没有被改变,而只是被弃用了而已(若引用数为零则被回收);
而你的变量在声明时就已经确定了内存地址,和你给它赋什么值没关系;
#4
更多评论
`s = "new text"`指的是,把`s`指向一个新地址,go无法实现在不改变地址的情况下改变字符串的内容。其实java也这么处理。这样的好处是,多线程修改字符串的时候免得加锁保护
#2