为什么说go语言中的string是不可变的?

ddxx11223 · 2017-09-29 02:58:17 · 6857 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2017-09-29 02:58:17 的主题,其中的信息可能已经有所发展或是发生改变。

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

6857 次点击  
加入收藏 微博
12 回复  |  直到 2022-11-27 12:59:20
polaris
polaris · #1 · 8年之前

s[0] = '1' 不能这样

jthmath
jthmath · #2 · 8年之前

s = "new text"指的是,把s指向一个新地址,go无法实现在不改变地址的情况下改变字符串的内容。其实java也这么处理。这样的好处是,多线程修改字符串的时候免得加锁保护

ddxx11223
ddxx11223 · #3 · 8年之前
jthmathjthmath #2 回复

`s = "new text"`指的是,把`s`指向一个新地址,go无法实现在不改变地址的情况下改变字符串的内容。其实java也这么处理。这样的好处是,多线程修改字符串的时候免得加锁保护

谢谢回答。那如果我s指向一个新的地址了,那原来的地址怎么办?自动回收?

SuriFuture
SuriFuture · #4 · 8年之前

Go的字符串也是引用类型,它类似切片,也包含一个指针字段,该字段指向它引用的字节系列的数组[]byte; 你改变一个字符串变量的值,只是改变指针字段的指向,指向新的值转化而来的字节数组,原来的字节数组并没有被改变,而只是被弃用了而已(若引用数为零则被回收); 而你的变量在声明时就已经确定了内存地址,和你给它赋什么值没关系;

jthmath
jthmath · #5 · 8年之前
ddxx11223ddxx11223 #3 回复

#2楼 @jthmath 谢谢回答。那如果我s指向一个新的地址了,那原来的地址怎么办?自动回收?

原来那些字符所在的内存,如果没人用了,就归垃圾回收器管理,等待被回收

christian-chen
christian-chen · #6 · 8年之前

不可变的意思是说 你不能像c语言那样去修改字符串的值, string可以理解成字符slice一样,只是不能修改

ddxx11223
ddxx11223 · #7 · 8年之前
SuriFutureSuriFuture #4 回复

Go的字符串也是引用类型,它类似切片,也包含一个指针字段,该字段指向它引用的字节系列的数组[]byte; 你改变一个字符串变量的值,只是改变指针字段的指向,指向新的值转化而来的字节数组,原来的字节数组并没有被改变,而只是被弃用了而已(若引用数为零则被回收); 而你的变量在声明时就已经确定了内存地址,和你给它赋什么值没关系;

明白了,谢谢回答

ddxx11223
ddxx11223 · #8 · 8年之前
jthmathjthmath #5 回复

#3楼 @ddxx11223 原来那些字符所在的内存,如果没人用了,就归垃圾回收器管理,等待被回收

好的,明白了,谢谢

ddxx11223
ddxx11223 · #9 · 8年之前
christian-chenchristian-chen #6 回复

不可变的意思是说 你不能像c语言那样去修改字符串的值, string可以理解成字符slice一样,只是不能修改

嗯嗯,现在知道了,谢谢回答

golwei
golwei · #10 · 8年之前

意思是说"字符串字符串字符串"是一个原子.

markcheney
markcheney · #11 · 8年之前

学习了

geek
geek · #12 · 2年之前
jthmathjthmath #2 回复

`s = "new text"`指的是,把`s`指向一个新地址,go无法实现在不改变地址的情况下改变字符串的内容。其实java也这么处理。这样的好处是,多线程修改字符串的时候免得加锁保护

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传