有人可以解释为什么在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
看看主要的 rune 容量从2变为32。为什么 ?如果要测试=> Go playground
最佳答案
只要转换的结果 slice 包含输入字符串的 rune ,容量就可以更改为任意值。这是规格要求和保证的唯一内容。如果将编译器传递给fmt.Println()
,则编译器可能会决定使用更低的容量,因为这表明 slice 可能会转义。再次,由编译器做出的决定是您无法控制的。
转义表示该值可能会从函数中转义,因此,它必须分配在堆上(而不是在堆栈上),因为一旦函数返回,并且如果值从转义中“转义”,则堆栈可能会被破坏/覆盖。该函数,只要有对该值的引用,就必须保留其存储区。 Go编译器执行转义分析,如果无法证明某个值不会转义其声明的函数,则该值将分配在堆上。
查看相关问题:Calculating sha256 gives different results after appending slices depending on if I print out the slice before or not
关于string - 从字符串转换时如何确定[] rune 的容量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/62794038/