为什么 Golang 不允许字符串中的字符切换?
Why character switching in string is not allowed in Golang?
我理解 Go 字符串基本上是一个字节数组。为什么不允许 str[0] = str[1] 的解释是什么?谢谢!
str := "hello"
str[0] = str[1]
// expecting eello
I understand that Go string is basically an array of bytes.
不完全是。一个字符串由
组成
- 指向字节数组的指针,并且
- 一个对应于该数组长度的整数。
如果您可以更新给定字符串变量的单个 符文,那么字符串将是可变的,against the wishes of the Go designers:
Strings are immutable: once created, it is impossible to change the contents of a string.
另请参阅 golang.org 博客上的 this post:
In Go, a string is in effect a read-only slice of bytes.
不可变性有很多优点——一方面,它很容易推理——但它可能被认为是一种麻烦。当然,覆盖一个字符串变量是合法的:
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
但是,请注意,这样做涉及复制,如果字符串很长 and/or 如果重复执行,这可能会影响性能。
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
我理解 Go 字符串基本上是一个字节数组。为什么不允许 str[0] = str[1] 的解释是什么?谢谢!
str := "hello"
str[0] = str[1]
// expecting eello
I understand that Go string is basically an array of bytes.
不完全是。一个字符串由
组成- 指向字节数组的指针,并且
- 一个对应于该数组长度的整数。
如果您可以更新给定字符串变量的单个 符文,那么字符串将是可变的,against the wishes of the Go designers:
Strings are immutable: once created, it is impossible to change the contents of a string.
另请参阅 golang.org 博客上的 this post:
In Go, a string is in effect a read-only slice of bytes.
不可变性有很多优点——一方面,它很容易推理——但它可能被认为是一种麻烦。当然,覆盖一个字符串变量是合法的:
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
但是,请注意,这样做涉及复制,如果字符串很长 and/or 如果重复执行,这可能会影响性能。
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