2

有人可以解释为什么我在转换相同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 的。如何?为什么 ?

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

4

2 回答 2

5

只要转换的结果切片包含输入字符串的符文,容量就可以更改为任何值。这是规范要求和保证的唯一事情。如果您将其传递给,编译器可能会决定使用较低的容量,fmt.Println()因为这表明切片可能会逃逸。同样,编译器做出的决定不在您的掌控之中。

转义意味着值可能会从函数中逃逸,因此,它必须分配在堆上(而不是堆栈上),因为一旦函数返回,堆栈可能会被破坏/覆盖,并且如果值从该函数,只要有对该值的引用,就必须保留其内存区域。Go 编译器执行转义分析,如果它不能证明一个值没有转义它声明的函数,则该值将分配到堆上。

请参阅相关问题:根据我之前是否打印出切片,计算 sha256 在附加切片后给出不同的结果

于 2020-07-08T11:56:55.400 回答
-1

string[]rune返回不同结果的原因len是它计算了不同的东西;len(string)返回以字节为单位的长度(可能大于字符数,对于多字节字符),同时len([]rune)返回 rune 切片的长度,即 UTF-8 rune 的数量(通常为字符数) .

这篇博文详细介绍了 Go 究竟如何处理各种形式的文本:https ://blog.golang.org/strings

于 2020-07-08T13:28:27.047 回答