gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 20:23:52 25 4
gpt4 key购买 nike

有人能解释一下为什么我在 []rune 中转换相同的 string 时得到不同的容量吗?

看看这段代码

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com