美文网首页
为什么说 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 字符串的遍历

    一 go字符串简介 在go 语言中字符串是一个不可变的字节序列,最基本的组成元素的字节,并且使用UTF-8的编码方...

  • 《Go语言四十二章经》第十章 string

    作者:李骁 10.1 有关string Go 语言中的string类型存储的字符串是不可变的, 如果要修改stri...

  • Go 字符串拼接最佳实践

    字符串是一个常见的数据类型,在 Go 语言在内的很多语言中,为了安全,都把字符串设计为不可变。每生成一个字符串都是...

  • NSString字符串

    NSString:不可变字符串 NSMutableString:可变字符串 //c语言中的字符串 char *s ...

  • NSString字符串

    NSString:不可变字符串 NSMutableString:可变字符串 //c语言中的字符串 char *s ...

  • Go语言 字符串(string)

    什么是字符串一个Go语言字符串是一个任意字节的常量序列。 Go语言字符串与其他语言(Java,C++,Python...

  • go 杂记

    1. string和buffer 当需要对一个字符串进行频繁的操作时,谨记在go语言中字符串是不可变的(类似jav...

  • 总结 - IOS

    一. NSString 原理: 示例: 为什么不采用retain 不管我传进来的是可变还是不可变字符串,新str...

  • Go语言:字符串数组 拼接成 字符串

    代码实例: 相关文章: Go语言:字符串数组 拼接成 字符串 Go语言:字符串 分割成 字符串数组

  • Go语言:字符串 分割成 字符串数组

    代码实例: 相关文章: Go语言:字符串数组 拼接成 字符串 Go语言:字符串 分割成 字符串数组

网友评论

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

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