为什么说 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)

这样就可以了。

责任编辑:武晓燕 来源: AlwaysBeta
相关推荐

2015-03-19 15:04:06

2023-01-03 08:07:33

Go字符串指针

2015-10-12 08:56:27

Java不可变

2011-10-27 13:37:51

网页设计

2023-03-21 15:27:00

RedisC语言字符串

2023-03-28 07:26:37

2023-05-04 07:44:13

编程界小语言Java

2023-12-11 07:33:05

Go语言字符技巧

2024-05-30 12:17:25

2022-05-20 11:41:00

数据科学编程语言Python

2018-03-07 15:50:10

物联网语言信息技术

2020-04-07 16:12:56

Go编程语言开发

2022-11-10 07:43:45

2020-11-02 17:21:07

云计算

2021-05-19 16:21:16

比特币加密货币货币

2021-11-26 22:14:55

PHP编程语言开发

2013-02-25 09:46:22

2022-03-14 08:33:09

TypeScriptJavaScript前端

2020-07-03 14:05:26

Serverless云服务商

2021-11-29 18:27:12

Web Wasmjs
点赞
收藏

51CTO技术栈公众号