![](/img/trans.png)
[英]How does Rust determine the length of a slice when unsizing from an array?
[英]How is the term “dynamically sized” for slice justifiable, when maximum length of a slice is less than length of the underlying array?
即使有上限,動態大小仍然是動態的:它可以在零和上限之間變化。
也就是說,正如Flimzy 在評論中指出的那樣,如果您使用可以“增長”切片的操作,它總是返回一個新切片,或者獲取指向切片的指針(通常是前者),以便需要執行的例程超過當前容量可以分配一個新的、更大的數組1並使切片使用它而不是舊數組。
這就是為什么append
返回一個新值,你必須寫:
s = append(s, element)
例如。
(之前的底層數組,如果有的話,在適當的時候被垃圾收集。一個 nil 切片沒有底層數組,因此容量為零。)
1運行時使用unsafe
和其他特殊技巧來分配這個數組,繞過類型檢查,但與運行時自己的垃圾收集代碼協調。 因此,它可以分配一個數組,其大小是在運行時而不是在編譯時選擇的。 編譯器的new
和make
和append
內置函數可以訪問相同的功能。
您可以使用unsafe
自己編寫這種相同類型的棘手代碼,但是如果您這樣做了,您將面臨在新 Go 版本發布時不得不重寫代碼的風險,如果新 Go 已經在內部更改了某些內容。 所以,不要這樣做:使用append
或make
創建運行時大小的數組,其中已經為您設置了切片數據。
當切片不能超出底層數組的大小時,如何將切片稱為動態大小。
類型是靜態與動態。 數組類型類似於[4]byte
- 大小是類型定義的一部分,因此在編譯時設置。 只有[4]byte
可以存儲在[4]byte
類型的變量中。 不是[3]byte
,也不是[5]byte
。 它是靜態的。
切片類型就像[]byte
- 大小不是類型定義的一部分,所以它不是在編譯時設置的,任何大小的切片都可以在運行時存儲在[]byte
中。 它可能是零長度,也可能是一千,也可能是一個四字節的窗口,變成一百萬長度的數組。 它是動態的。
切片的大小也可以在運行時在其容量范圍內縮小和增長,盡管容量只能通過替換底層數組(作為一個數組,具有固定大小)來改變。 例如,這是通過append
在幕后自動完成的。 但是,至少在我的理解中,這並不是切片“動態”的原因; 事實上,切片在運行時可以是任意大小 - 在編譯時是未知的。 這就是我將它們定義為“動態”的原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.