为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
哆啦的时光机 2022-09-12 20:22:32
我正在从C背景开始自学。下面的代码按照我的预期工作(前两个将访问字节,最后两个将访问代码点)。Printf()Printf()我不清楚的是,这是否涉及任何数据复制。package mainimport "fmt"var a stringfunc 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])}换句话说:确实创建了一个符文数组,并用对应于 的符文填充它,或者只是编译器来弄清楚如何从字符串字节中获取符文?[]rune("string")"string"
查看完整描述

2 回答

?
慕的地10843

TA贡献1785条经验 获得超8个赞

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

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


查看完整回答
反对 回复 2022-09-12
?
波斯汪

TA贡献1811条经验 获得超4个赞

它涉及副本,因为:

  • 字符串是不可变的;如果转换没有复制,您将能够为符文切片编制索引并更改字符串内容[]rune(s)

  • 字符串值是“(可能是空的)字节序列”,其中 是 的别名,而符文“标识 Unicode 代码点的整数值”和 别名 。类型不相同,甚至长度也可能不相同:byteuint8int32

  a = "èe"

    r := []rune(a)

    fmt.Println(len(a)) // 3 (3 bytes)

    fmt.Println(len(r)) // 2 (2 Unicode code points)


查看完整回答
反对 回复 2022-09-12
  • 2 回答
  • 0 关注
  • 61 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信