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

有人可以解释为什么我在转换相同string的容量时会得到不同的容量[]rune吗?


看看这段代码


package main


import (

    "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 6

len 2

cap 2

panic: runtime error: slice bounds out of range [:3] with capacity 2

但是当评论fmt.Println(runes[:3])它返回时:


len 6

len 2

cap 32

看看 [] 符文容量是如何从 2 变为 32 的。如何?为什么 ?


如果你想测试 =>去游乐场


catspeake
浏览 210回答 2
2回答

繁星淼淼

只要转换的结果切片包含输入字符串的符文,容量就可以更改为任何值。这是规范要求和保证的唯一事情。如果您将其传递给,编译器可能会决定使用较低的容量,fmt.Println()因为这表明切片可能会逃逸。同样,编译器做出的决定不在您的掌控之中。转义意味着值可能会从函数中逃逸,因此,它必须分配在堆上(而不是堆栈上),因为一旦函数返回,堆栈可能会被破坏/覆盖,如果值从该函数,只要有对该值的引用,就必须保留其内存区域。Go 编译器执行转义分析,如果它不能证明一个值没有转义它声明的函数,则该值将分配到堆上。

炎炎设计

string和[]rune返回不同结果的原因len是它计算了不同的东西;len(string)返回以字节为单位的长度(可能大于字符数,对于多字节字符),同时len([]rune)返回 rune 切片的长度,即 UTF-8 rune 的数量(通常为字符数) .这篇博文详细介绍了 Go 究竟如何处理各种形式的文本:https ://blog.golang.org/strings
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go