为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
BIG阳 2022-09-26 20:22:32
我知道Go字符串基本上是一个字节数组。为什么不允许使用 str[0] = str[1] 的解释是什么?谢谢!str := "hello"str[0] = str[1]// expecting eello
查看完整描述

2 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

我知道Go字符串基本上是一个字节数组。

不完全是。字符串由

  • 指向字节数组的指针,以及

  • 一个与该数组的长度相对应的整数。

如果您可以更新给定字符串变量的单个符文,那么字符串将是可变的,这与Go设计人员的愿望相反

字符串是不可变的:一旦创建,就不可能更改字符串的内容。

另请参阅 golang.org 博客上的这篇文章

在 Go 中,字符串实际上是只读的字节片。

不变性有很多优点 - 首先,它很容易推理 - 但它可以被视为一种麻烦。当然,覆盖字符串变量是合法的:

str := "hello"

str = "eello"

此外,您始终可以将字符串转换为可变的数据结构(即 a 或 a ),进行所需的更改,然后将结果转换回字符串。[]byte[]rune


str := "hello"

fmt.Println(str)

bs := []byte(str)

bs[0] = bs[1]

str = string(bs)

fmt.Println(str)

输出:


hello

eello

(操场)


但是,请注意,这样做涉及复制,如果字符串很长和/或重复执行,则可能会损害性能。


查看完整回答
反对 回复 2022-09-26
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

Go字符串是不可变的,行为类似于只读字节切片,要更新数据,请改用符文切片;


package main


import (

    "fmt"

)


func main() {


    str := "hello"

    fmt.Println(str)


    buf := []rune(str)

    buf[0] = buf[1]

    s := string(buf)

    fmt.Println(s)

}

输出:


 hello

 eello   


查看完整回答
反对 回复 2022-09-26
  • 2 回答
  • 0 关注
  • 84 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信