写点什么

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

作者:AlwaysBeta
  • 2023-06-02
    北京
  • 本文字数:652 字

    阅读完需:约 2 分钟

原文链接: 为什么说 Go 语言字符串是不可变的?


最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?


这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。


首先来看看它的底层结构:


type stringStruct struct {    str unsafe.Pointer    len int}
复制代码


和切片的结构很像,只不过少了一个表示容量的 cap 字段。


  • str:指向一个 []byte 类型的指针

  • len:字符串的长度


所以,当我们定义一个字符串:


s := "Hello World"
复制代码


那么它在内存中存储是这样的:



当我们在程序中对字符串进行重新赋值时,比如这样:


s := "Hello World"
s = "Hello AlwaysBeta"
复制代码


底层的存储就变成了这样:



Go 实际上是重新创建了一个 []byte{} 切片,然后让指针指向了新的地址。


更直接一点,我们直接修改字符串中的单个字符,比如:


s := "Hello World"s[0] = 'h'
复制代码


这样做的话,会直接报错:


cannot assign to s[0] (strings are immutable)
复制代码


如果一定要这么做的话,需要对字符串进行一个转换,转换成 []byte 类型,修改之后再转换回 string 类型:


s := "Hello World"sBytes := []byte(s)sBytes[0] = 'h's = string(sBytes)
复制代码


这样就可以了。


以上就是本文的全部内容,如果觉得还不错的话欢迎点赞转发关注,感谢支持。




推荐阅读:


发布于: 刚刚阅读数: 6
用户头像

AlwaysBeta

关注

微信公众号:AlwaysBeta 2017-11-30 加入

专注分享后端开发技术干货!

评论

发布
暂无评论
为什么说 Go 语言字符串是不可变的?_Go_AlwaysBeta_InfoQ写作社区