从字符串到符文切片的转换是否复制?

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)