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

从字符串转换时如何确定 []rune 的容量

从字符串转换时如何确定 []rune 的容量

Go
catspeake 2022-06-13 16:50:58
有人可以解释为什么我在转换相同string的容量时会得到不同的容量[]rune吗?看看这段代码package mainimport (    "fmt")func main() {    input := "你好"                runes := []rune(input)    fmt.Printf("len %d\n", len(input))    fmt.Printf("len %d\n", len(runes))    fmt.Printf("cap %d\n", cap(runes))    fmt.Println(runes[:3])}哪个回报len 6len 2cap 2panic: runtime error: slice bounds out of range [:3] with capacity 2但是当评论fmt.Println(runes[:3])它返回时:len 6len 2cap 32看看 [] 符文容量是如何从 2 变为 32 的。如何?为什么 ?如果你想测试 =>去游乐场
查看完整描述

2 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

只要转换的结果切片包含输入字符串的符文,容量就可以更改为任何值。这是规范要求和保证的唯一事情。如果您将其传递给,编译器可能会决定使用较低的容量,fmt.Println()因为这表明切片可能会逃逸。同样,编译器做出的决定不在您的掌控之中。

转义意味着值可能会从函数中逃逸,因此,它必须分配在堆上(而不是堆栈上),因为一旦函数返回,堆栈可能会被破坏/覆盖,如果值从该函数,只要有对该值的引用,就必须保留其内存区域。Go 编译器执行转义分析,如果它不能证明一个值没有转义它声明的函数,则该值将分配到堆上。


查看完整回答
反对 回复 2022-06-13
?
炎炎设计

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

string[]rune返回不同结果的原因len是它计算了不同的东西;len(string)返回以字节为单位的长度(可能大于字符数,对于多字节字符),同时len([]rune)返回 rune 切片的长度,即 UTF-8 rune 的数量(通常为字符数) .

这篇博文详细介绍了 Go 究竟如何处理各种形式的文本:https ://blog.golang.org/strings


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

添加回答

举报

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