有人可以解释为什么我在转换相同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 编译器执行转义分析,如果它不能证明一个值没有转义它声明的函数,则该值将分配到堆上。
炎炎设计
TA贡献1808条经验 获得超4个赞
string
和[]rune
返回不同结果的原因len
是它计算了不同的东西;len(string)
返回以字节为单位的长度(可能大于字符数,对于多字节字符),同时len([]rune)
返回 rune 切片的长度,即 UTF-8 rune 的数量(通常为字符数) .
这篇博文详细介绍了 Go 究竟如何处理各种形式的文本:https ://blog.golang.org/strings
- 2 回答
- 0 关注
- 205 浏览
添加回答
举报
0/150
提交
取消