环球即时看!为什么说 Go 语言字符串是不可变的?

2023-05-29 12:33:33 来源:AlwaysBeta

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

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

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)

这样就可以了。

标签:

为您推荐

新闻快讯