为什么在高浪中不允许在字符串中切换字符?

我知道Go字符串基本上是一个字节数组。为什么不允许使用 str[0] = str[1] 的解释是什么?谢谢!


str := "hello"

str[0] = str[1]


// expecting eello


BIG阳
浏览 85回答 2
2回答

HUX布斯

我知道Go字符串基本上是一个字节数组。不完全是。字符串由指向字节数组的指针,以及一个与该数组的长度相对应的整数。如果您可以更新给定字符串变量的单个符文,那么字符串将是可变的,这与Go设计人员的愿望相反:字符串是不可变的:一旦创建,就不可能更改字符串的内容。另请参阅 golang.org 博客上的这篇文章:在 Go 中,字符串实际上是只读的字节片。不变性有很多优点 - 首先,它很容易推理 - 但它可以被视为一种麻烦。当然,覆盖字符串变量是合法的:str := "hello"str = "eello"此外,您始终可以将字符串转换为可变的数据结构(即 a 或 a ),进行所需的更改,然后将结果转换回字符串。[]byte[]runestr := "hello"fmt.Println(str)bs := []byte(str)bs[0] = bs[1]str = string(bs)fmt.Println(str)输出:helloeello(操场)但是,请注意,这样做涉及复制,如果字符串很长和/或重复执行,则可能会损害性能。

慕妹3146593

Go字符串是不可变的,行为类似于只读字节切片,要更新数据,请改用符文切片;package mainimport (    "fmt")func main() {    str := "hello"    fmt.Println(str)    buf := []rune(str)    buf[0] = buf[1]    s := string(buf)    fmt.Println(s)}输出: hello eello   
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go