有人可以解释为什么在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/

10-13 05:36