【问题标题】:Why character switching in string is not allowed in Golang?为什么 Golang 中不允许字符串中的字符切换?
【发布时间】:2021-11-05 19:00:36
【问题描述】:

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

str := "hello"
str[0] = str[1]

// expecting eello

【问题讨论】:

标签: string go immutability


【解决方案1】:

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

不完全是。一个字符串由

组成
  • 指向数组字节的指针,以及
  • 对应于该数组长度的整数。

如果您可以更新给定字符串变量的单个 runes,那么字符串将是可变的,against the wishes of the Go designers:

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

另请参阅 golang.org 博客上的 this post

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

不变性有很多优点 - 一方面,它很容易推理 - 但它可能被视为令人讨厌。当然,覆盖字符串变量是合法的:

str := "hello"
str = "eello"

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

str := "hello"
fmt.Println(str)
bs := []byte(str)
bs[0] = bs[1]
str = string(bs)
fmt.Println(str)

输出:

hello
eello

(Playground)

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

【讨论】:

    【解决方案2】:

    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   
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-07-18
      • 1970-01-01
      • 2011-01-31
      • 2015-09-15
      • 2011-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多