若是一個函數最後一個參數被標記爲…T
,表示函數能夠接受一個可變的參數。數組
好比,咱們想在nums中查找num是否存在:app
func find(num int, nums …int){ }
目的是經過find函數,在nums中查找num。函數
好比:指針
find(89,89,90,91)
會返回true。code
可變參數函數的原理是把可變參數轉換成一個新的切片。內存
上面例子中,就能夠變成for循環遍歷nums切片,查找num。ci
若是可變參數沒有傳,則nums變成了一個長度爲0的nil切片。it
既然咱們知道了可變參數會被轉換成切片,那麼經過go語法糖,能夠將一個存在的分配看成可變參數的參數。for循環
經過在切片後加上…後綴完成,這樣傳入一個切片後,切片將不會再進行建立新分片的操做。原理
nums := []int{89,90,95} find(89, nums…)
切片是數組之上的靈活切強大的包裝,切片自己不包含任何數據,只是對現有數組的引用,因而咱們對分片的值修改最後都會反映到數組自己上。
分片中numa[:],這種缺乏開始和結束值,開始值會默認爲0,結束值會是len(numa),則此分片會和原數組共享數組,分片中值的任何修改都會反映到數組自己上。
經過make語法能夠建立一個分片:
I := make([]int, 5, 5) // 建立指定長度和容量的分片,默認值爲0
因爲數組長度是固定的,長度不能增長,切片則是動態的,使用append能夠將新元素追加到分片上。
當新元素被添加到切片中時,會建立一個新的數組,現有數組元素被複制到這個新數組中,返回新數組的引用,這樣就經過複製新數組方式完成了數組的擴容,每次擴容,新數組容量會擴大一倍。
經過append能夠將一個分片添加到另外一個分片。
切片內部是個結構體:
type slice struct{ Length int Capacity int ZerothElement *byte }
包含切片長度,容量,指向的數組第零個元素指針。
切片底層持有數組引用,只要切片在內存中,數組就不會被回收。 若是數組很大,可是咱們只須要處理數組一小部分,這時能夠採用copy函數,生成一個切片副本,這樣咱們能夠操做新切片,原始數組能夠被回收了。