簡體   English   中英

當切片的最大長度小於底層數組的長度時,切片的“動態大小”一詞如何合理?

[英]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和其他特殊技巧來分配這個數組,繞過類型檢查,但與運行時自己的垃圾收集代碼協調。 因此,它可以分配一個數組,其大小是在運行時而不是在編譯時選擇的。 編譯器的newmakeappend內置函數可以訪問相同的功能。

您可以使用unsafe自己編寫這種相同類型的棘手代碼,但是如果您這樣做了,您將面臨在新 Go 版本發布時不得不重寫代碼的風險,如果新 Go 已經在內部更改了某些內容。 所以,不要這樣做:使用appendmake創建運行時大小的數組,其中已經為您設置了切片數據。

Go 數組的大小在編譯時是固定的。 Go 切片的大小在運行時動態設置。


參考:

Go 博客:Go Slices:用法和內部結構

Go 博客:數組、切片(和字符串):“追加”的機制

當切片不能超出底層數組的大小時,如何將切片稱為動態大小。

類型是靜態與動態。 數組類型類似於[4]byte - 大小是類型定義的一部分,因此在編譯時設置。 只有[4]byte可以存儲在[4]byte類型的變量中。 不是[3]byte ,也不是[5]byte 它是靜態的。

切片類型就像[]byte - 大小不是類型定義的一部分,所以它不是在編譯時設置的,任何大小的切片都可以在運行時存儲在[]byte中。 它可能是零長度,也可能是一千,也可能是一個四字節的窗口,變成一百萬長度的數組。 它是動態的。

切片的大小也可以在運行時在其容量范圍內縮小和增長,盡管容量只能通過替換底層數組(作為一個數組,具有固定大小)來改變。 例如,這是通過append在幕后自動完成的。 但是,至少在我的理解中,這並不是切片“動態”的原因; 事實上,切片在運行時可以是任意大小 - 在編譯時是未知的。 這就是我將它們定義為“動態”的原因。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM