有人可以解釋為什么我在轉換相同string的容量時會得到不同的容量[]rune嗎?看看這段代碼package mainimport ( "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 6len 2cap 2panic: runtime error: slice bounds out of range [:3] with capacity 2但是當評論fmt.Println(runes[:3])它返回時:len 6len 2cap 32看看 [] 符文容量是如何從 2 變為 32 的。如何?為什么 ?如果你想測試 =>去游樂場
2 回答

繁星淼淼
TA貢獻1775條經驗 獲得超11個贊
只要轉換的結果切片包含輸入字符串的符文,容量就可以更改為任何值。這是規范要求和保證的唯一事情。如果您將其傳遞給,編譯器可能會決定使用較低的容量,fmt.Println()
因為這表明切片可能會逃逸。同樣,編譯器做出的決定不在您的掌控之中。
轉義意味著值可能會從函數中逃逸,因此,它必須分配在堆上(而不是堆棧上),因為一旦函數返回,堆??赡軙黄茐?覆蓋,如果值從該函數,只要有對該值的引用,就必須保留其內存區域。Go 編譯器執行轉義分析,如果它不能證明一個值沒有轉義它聲明的函數,則該值將分配到堆上。

炎炎設計
TA貢獻1808條經驗 獲得超4個贊
string
和[]rune
返回不同結果的原因len
是它計算了不同的東西;len(string)
返回以字節為單位的長度(可能大于字符數,對于多字節字符),同時len([]rune)
返回 rune 切片的長度,即 UTF-8 rune 的數量(通常為字符數) .
這篇博文詳細介紹了 Go 究竟如何處理各種形式的文本:https ://blog.golang.org/strings
- 2 回答
- 0 關注
- 236 瀏覽
添加回答
舉報
0/150
提交
取消