从字符串到符文切片的转换是否复制?
Does the conversion from string to rune slice make a copy?
我正在自学 C 语言背景的 Go。
下面的代码按我的预期工作(前两个 Printf()
将访问字节,最后两个 Printf()
将访问代码点)。
我不清楚这是否涉及任何数据复制。
package main
import "fmt"
var a string
func main() {
a = "èe"
fmt.Printf("%d\n", a[0])
fmt.Printf("%d\n", a[1])
fmt.Println("")
fmt.Printf("%d\n", []rune(a)[0])
fmt.Printf("%d\n", []rune(a)[1])
}
换句话说:
does []rune("string")
create an array of runes and fill it with the runes corresponding to "string"
, or it's just the compiler that figures out how to get runes from the string bytes?
不分配数组就无法将 []uint8(即字符串)转换为 []int32(an alias for []rune)。
此外,strings are immutable in Go 但切片不是,因此转换为 []byte 和 []rune 必须以某种方式复制字符串的字节。
它涉及一个副本,因为:
- 字符串是不可变的;如果转换
[]rune(s)
没有复制,您将能够索引符文切片并更改字符串内容
- a
string
value is a "(possibly empty) sequence of bytes", where byte
is an alias of uint8
, whereas a rune
是一个 “标识 Unicode 代码点的整数值” 和 int32
的别名。类型不一样,甚至长度也可能不一样:
a = "èe"
r := []rune(a)
fmt.Println(len(a)) // 3 (3 bytes)
fmt.Println(len(r)) // 2 (2 Unicode code points)
我正在自学 C 语言背景的 Go。
下面的代码按我的预期工作(前两个 Printf()
将访问字节,最后两个 Printf()
将访问代码点)。
我不清楚这是否涉及任何数据复制。
package main
import "fmt"
var a string
func main() {
a = "èe"
fmt.Printf("%d\n", a[0])
fmt.Printf("%d\n", a[1])
fmt.Println("")
fmt.Printf("%d\n", []rune(a)[0])
fmt.Printf("%d\n", []rune(a)[1])
}
换句话说:
does
[]rune("string")
create an array of runes and fill it with the runes corresponding to"string"
, or it's just the compiler that figures out how to get runes from the string bytes?
不分配数组就无法将 []uint8(即字符串)转换为 []int32(an alias for []rune)。
此外,strings are immutable in Go 但切片不是,因此转换为 []byte 和 []rune 必须以某种方式复制字符串的字节。
它涉及一个副本,因为:
- 字符串是不可变的;如果转换
[]rune(s)
没有复制,您将能够索引符文切片并更改字符串内容 - a
string
value is a "(possibly empty) sequence of bytes", wherebyte
is an alias ofuint8
, whereas arune
是一个 “标识 Unicode 代码点的整数值” 和int32
的别名。类型不一样,甚至长度也可能不一样:
a = "èe"
r := []rune(a)
fmt.Println(len(a)) // 3 (3 bytes)
fmt.Println(len(r)) // 2 (2 Unicode code points)