3 回答

TA貢獻1887條經(jīng)驗 獲得超5個贊
當您考慮列表時,幾乎總是 - 在 Go 中使用切片代替。切片動態(tài)調整大小。它們的底層是一個可以改變大小的連續(xù)內存片。
這是摘錄:
復制
b?=?make([]T,?len(a))copy(b,?a)?//?or?b?=?append([]T(nil),?a...)切
a?=?append(a[:i],?a[j:]...)刪除
a?=?append(a[:i],?a[i+1:]...)?//?or?a?=?a[:i+copy(a[i:],?a[i+1:])]刪除而不保留順序
a[i],?a?=?a[len(a)-1],?a[:len(a)-1]流行音樂
x,?a?=?a[len(a)-1],?a[:len(a)-1]推
a?=?append(a,?x)

TA貢獻1844條經(jīng)驗 獲得超8個贊
幾個月前,當我第一次開始研究 Go 時,我問過這個問題。從那時起,我每天都在閱讀有關 Go 的文章,并使用 Go 進行編碼。
因為我沒有得到這個問題的明確答案(雖然我已經(jīng)接受了一個答案)我現(xiàn)在要根據(jù)我所學到的來回答這個問題,因為我問過它:
有沒有辦法在沒有硬編碼數(shù)組大小的情況下在 Go 中創(chuàng)建數(shù)組/切片?
是的。切片不需要硬編碼數(shù)組即可slice:
var sl []int = make([]int,len,cap)
此代碼分配容量為-sl大小的slice ,并且是可以在運行時分配的變量。lencaplencap
為什么被list.List忽略?
list.List在 Go 中似乎很少受到關注的主要原因是:
正如@Nick Craig-Wood 的回答中所解釋的那樣,使用切片無法完成的列表幾乎沒有任何事情可以完成,通常更有效,并且語法更簡潔,更優(yōu)雅。例如范圍構造:
for i:=range sl {
sl[i]=i
}
不能與列表一起使用 - 需要 C 風格的 for 循環(huán)。并且在許多情況下,C++ 集合樣式語法必須與列表一起使用: push_back等。
也許更重要的是,list.List它不是強類型的——它與 Python 的列表和字典非常相似,允許在集合中混合各種類型。這似乎與 Go 處理事物的方法背道而馳。Go 是一種非常強類型的語言——例如,Go 中從不允許隱式類型轉換,即使是從intto的 upCast也int64必須是顯式的。但是 list.List 的所有方法都采用空接口 - 任何事情都可以。
我放棄 Python 而轉向 Go 的原因之一是因為 Python 類型系統(tǒng)的這種弱點,盡管 Python 聲稱是“強類型”(IMO 并非如此)。Golist.List似乎是一種“雜種”,誕生于 C++vector<T>和 Python 的 List(),并且在 Go 本身中可能有點格格不入。
如果在不久的將來的某個時候,我們發(fā)現(xiàn) list.List 在 Go 中已被棄用,我不會感到驚訝,盡管它可能會保留,以適應那些即使使用良好的設計實踐也能最好地解決問題的罕見情況擁有一個包含各種類型的集合?;蛘咚赡転?C 系列開發(fā)人員提供一個“橋梁”,讓他們在學習切片的細微差別之前熟悉 Go,AFAIK。(在某些方面,切片似乎類似于 C++ 或 Delphi 中的流類,但并非完全如此。)
雖然來自 Delphi/C++/Python 背景,但在我最初接觸 Go 時,我發(fā)現(xiàn)list.List比 Go 的 slice 更熟悉,因為我對 Go 越來越熟悉,我回去將所有列表更改為 slice。我還沒有發(fā)現(xiàn)任何東西slice和/或map不允許我這樣做,所以我需要使用list.List.
- 3 回答
- 0 關注
- 271 瀏覽
添加回答
舉報