s := "foobar阿斯蒂芬"
fmt.Println(s)
fmt.Println(&s)
s = "qweqweqweqweqwe"
fmt.Println(s)
fmt.Println(&s)
这个不可变到底指的是啥意思?上面的代码不就使s这个string变量改变了吗?而且s的地址也没有变化(说明没有给s重新分配内存),那这样看来,s就是可变的呀,实在不懂,求解惑
有疑问加站长微信联系(非本文作者)

s := "foobar阿斯蒂芬"
fmt.Println(s)
fmt.Println(&s)
s = "qweqweqweqweqwe"
fmt.Println(s)
fmt.Println(&s)
这个不可变到底指的是啥意思?上面的代码不就使s这个string变量改变了吗?而且s的地址也没有变化(说明没有给s重新分配内存),那这样看来,s就是可变的呀,实在不懂,求解惑
有疑问加站长微信联系(非本文作者)
入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889
`单行代码`
s[0] = '1'
不能这样s = "new text"
指的是,把s
指向一个新地址,go无法实现在不改变地址的情况下改变字符串的内容。其实java也这么处理。这样的好处是,多线程修改字符串的时候免得加锁保护谢谢回答。那如果我s指向一个新的地址了,那原来的地址怎么办?自动回收?
Go的字符串也是引用类型,它类似切片,也包含一个指针字段,该字段指向它引用的字节系列的数组[]byte; 你改变一个字符串变量的值,只是改变指针字段的指向,指向新的值转化而来的字节数组,原来的字节数组并没有被改变,而只是被弃用了而已(若引用数为零则被回收); 而你的变量在声明时就已经确定了内存地址,和你给它赋什么值没关系;
原来那些字符所在的内存,如果没人用了,就归垃圾回收器管理,等待被回收
不可变的意思是说 你不能像c语言那样去修改字符串的值, string可以理解成字符slice一样,只是不能修改
明白了,谢谢回答
好的,明白了,谢谢
嗯嗯,现在知道了,谢谢回答
意思是说"字符串字符串字符串"是一个原子.
学习了
还是要加锁吧..参考这个https://dashen.tech/2018/07/19/golang%E4%B9%8Bstring%E7%B1%BB%E5%9E%8B%E5%8F%98%E9%87%8F%E6%93%8D%E4%BD%9C%E7%9A%84%E5%8E%9F%E5%AD%90%E6%80%A7/