下面由golang教學欄位介紹給大家Golang陣列的傳遞,希望對需要的朋友有幫助!
Golang數組的傳遞詳解
#今天小編就為大家分享一篇關於Golang數組的傳遞詳解,小編覺得內容蠻不錯的,現在分享給大家,有很好的參考價值,需要的朋友一起跟隨小編來看看吧
概念介紹
陣列與切片
陣列是具有相同唯一類型的一組已編號且長度固定的資料項序列。數組長度最大為2Gb,它是值型態。切片是對數組一個連續片段的引用,所以切片是一個引用類型。
按值傳遞和按引用傳遞
Go語言中函數的參數有兩種傳遞方式,按值傳遞和按引用傳遞。 Go預設使用以值傳遞來傳遞參數,也就是傳遞參數的副本。在函數中對副本的值進行更改操作時,不會影響原來的變數。
依照引用傳遞其實也可以稱作」依值傳遞」,只不過該副本是一個位址的拷貝,透過它可以修改這個值所指向的位址上的值。
Go語言中,當函式呼叫時,參考型別(slice、map、interface、channel)都預設使用引用傳遞。
陣列傳遞時的缺點
一般情況下,傳遞指標的消耗比傳遞副本的少,尤其是當陣列特別大時。具體原因是:
值傳遞需要完整的複製初始陣列並將此拷貝放到堆疊中,這將耗費大量運行時間,因而值傳遞方式的效率比較低。
初始陣列的拷貝需要佔用額外的記憶體空間(堆疊中的記憶體)
編譯程式需要專門產生一部分用來複製初始陣列的程式碼,這將使程式變大。
如何避免
如上面介紹的,有兩種方法,第一種利用指針,即引用傳遞;第二種使用切片,因為切片是引用類型,預設會使用引用傳遞。
使用指標傳遞
package main import "fmt" func main() { var arr = [5]int{1, 2, 3, 4, 5} fmt.Println(sum(&arr)) } func sum(arr *[5]int) int { s := 0 for i := 0; i < len(arr); i++ { s += arr[i] } return s }
使用切片傳遞
package main import "fmt" func main() { var arr = [5]int{1, 2, 3, 4, 5} fmt.Println(sum(arr[:])) } func sum(arr []int) int { s := 0 for i := 0; i < len(arr); i++ { s += arr[i] } return s }
最後一種方法通常比較常用。
以上是詳解Golang數組的傳遞的詳細內容。更多資訊請關注PHP中文網其他相關文章!