为什么说 Go 语言字符串是不可变的?

打印 上一主题 下一主题

主题 831|帖子 831|积分 2493

原文链接: 为什么说 Go 语言字符串是不可变的?
最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?
这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。
首先来看看它的底层结构:
  1. type stringStruct struct {
  2.     str unsafe.Pointer
  3.     len int
  4. }
复制代码
和切片的结构很像,只不过少了一个表示容量的 cap 字段。

  • str:指向一个 []byte 类型的指针
  • len:字符串的长度
所以,当我们定义一个字符串:
  1. s := "Hello World"
复制代码
那么它在内存中存储是这样的:

当我们在程序中对字符串进行重新赋值时,比如这样:
  1. s := "Hello World"
  2. s = "Hello AlwaysBeta"
复制代码
底层的存储就变成了这样:

Go 实际上是重新创建了一个 []byte{} 切片,然后让指针指向了新的地址。
更直接一点,我们直接修改字符串中的单个字符,比如:
  1. s := "Hello World"
  2. s[0] = 'h'
复制代码
这样做的话,会直接报错:
  1. cannot assign to s[0] (strings are immutable)
复制代码
如果一定要这么做的话,需要对字符串进行一个转换,转换成 []byte 类型,修改之后再转换回 string 类型:
  1. s := "Hello World"
  2. sBytes := []byte(s)
  3. sBytes[0] = 'h'
  4. s = string(sBytes)
复制代码
这样就可以了。
以上就是本文的全部内容,如果觉得还不错的话欢迎点赞转发关注,感谢支持。
推荐阅读:

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

涛声依旧在

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表