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



我在C语言背景下自学围棋。下面的代码正如我所期望的那样工作(前两个Printf()将访问字节,后两个Printf()将访问代码点(。

我不清楚的是,这是否涉及任何数据复制。

package main
import "fmt"
var a string
func main() {
a = "èe"
fmt.Printf("%dn", a[0])
fmt.Printf("%dn", a[1])
fmt.Println("")
fmt.Printf("%dn", []rune(a)[0])
fmt.Printf("%dn", []rune(a)[1])
}

换句话说:

[]rune("string")是创建一个符文数组并用对应于"string"的符文填充它,还是只是编译器知道如何从字符串字节中获取符文?

如果不分配数组,就不可能将[]uint8(即字符串(转换为[]int32([]rune的别名(。

此外,Go中的字符串是不可变的,但切片不是,因此对[]字节和[]符文的转换必须以某种方式复制字符串的字节。

它涉及一个副本,因为:

  • 字符串是不可变的;如果转换[]rune(s)没有进行复制,则可以对符文切片进行索引并更改字符串内容
  • CCD_ 6值是一个";(可能是空的(字节序列">,其中byteuint8的别名,而rune是"em>";标识Unicode码点的整数值"和CCD_ 10的别名。类型不相同,甚至长度也可能不相同:
a = "èe"
r := []rune(a)
fmt.Println(len(a)) // 3 (3 bytes)
fmt.Println(len(r)) // 2 (2 Unicode code points)

最新更新