美文网首页
为什么说 Go 语言字符串是不可变的?

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

作者: yongxinz | 来源:发表于2023-06-01 19:38 被阅读0次

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

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

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

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

    type stringStruct struct {
        str unsafe.Pointer
        len int
    }
    

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

    • str:指向一个 []byte 类型的指针
    • len:字符串的长度

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

    s := "Hello World"
    

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

    string.drawio.png

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

    s := "Hello World"
    
    s = "Hello AlwaysBeta"
    

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

    string.drawio (1).png

    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)
    

    这样就可以了。

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


    推荐阅读:

    相关文章

      网友评论

          本文标题:为什么说 Go 语言字符串是不可变的?

          本文链接:https://www.haomeiwen.com/subject/gdfpedtx.html