這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
合并slice,跟合并數組一樣,是比較常見的操作。映像中C++運算子多載以後,直接用加號就可以了。Golang果斷不行。先開始用copy
解決。
func copy(dst, src []Type) int
從來沒用過這個函數,傳回值和append
還不一樣,返回的是複製的數目。而且只能針對slice操作,不支援其他類型。能參數表也能看出,兩個參數必須是同一種類型,不可以是[]Type
和[]interface{}
這種形式。此函數也不是追加到dst
後面,而是從頭開始複製。如果要追加到後面,還需要指出位置資訊。copy
實現的合并數組完整代碼:
a := []int{1, 2, 3, 4}b := []int{5, 6, 7}c := make([]int, len(a)+len(b))copy(c, a)copy(c[len(a):], b)
在copy
的過程中,如果dst
空間不足,是不會自動追加空間的。所以,合并之前要申請一個足夠的空間。接著就是複製兩次。第二次複製還需要指出slice位置,防止被覆蓋。
這個代碼雖然功能上沒問題,但是總覺得比較髒。後來無意中發現,append
函數的參數是支援變長參數類型的。
func append(slice []Type, elems ...Type) []Type
這樣,三行複雜的代碼變成了一行:
a := []int{1, 2, 3, 4}b := []int{5, 6, 7}d := append(a, b...)
參考結果:
0xfeee1f740xfeee1f38[1 2 3 4 5 6 7]0xfeee1f2c[1 2 3 4 5 6 7]0xfeee1f20[5]
本文所涉及到的完整源碼請參考。
最近在看Effective Go,覺得不錯,推薦給大家。
參考文獻
- 【1】slice 刪除一個或多個項 - Go中文社區
- 【2】Go語言中合并slice - 達達的首頁
- 【3】Package builtin - The Go Programming Language
- 【4】數組(Array)和切片(Slice) - 烈冰
- 【5】Go Slices: usage and internals - The Go Blog
- 【6】看範例學 Golang (十四)- 可變參數函數 - G_will’s Blog
原文連結:Golang——append的可變參數,轉載請註明來源!