golang中陣列和slice作為引數的區別

2021-09-14 05:54:46 字數 1405 閱讀 9688

最近專案中有遇到類似問題,做個記錄。

舉個例子,[5]int為陣列,int為slice(陣列切片),陣列是值型別,而slice為引用型別,值型別作為引數傳入函式,只是拷貝了個副本,修改並不會作用到傳入的那個引數,所以一般使用slice作為引數,免去了拷貝的消耗,但是有坑在裡面,下面寫例子說明。

1.slice作為引數

package main

import "fmt"

type dbitem struct

func combineitem(itemlist dbitem, id int16, cnt int32)

itemlist[0] = item

fmt.printf("combineitem itemlist values: %v \n", itemlist)

}func main()

執行結果如下:

combineitem itemlist values: [ ]

main itemlist values: [ ]

2.陣列作為引數。

package main

import "fmt"

type dbitem struct

func combineitem(itemlist [5]dbitem, id int16, cnt int32)

itemlist[1] = item

fmt.printf("combineitem itemlist values: %v \n", itemlist)

}func main() }

combineitem(itemlist, int16(1), int32(2))

fmt.printf("main itemlist values: %v \n", itemlist)

}

執行結果如下:

combineitem itemlist values: [ ]

main itemlist values: [ ]

package main

import "fmt"

type dbitem struct

func combineitem(itemlist dbitem, id int16, cnt int32)

fmt.printf("combineitem itemlist values: %v \n", itemlist)

}func main()

執行結果如下:

combineitem itemlist values: [ ]

main itemlist values: [ ]

具體原因參見:

golang 陣列 slice 亂序

陣列亂序 方法1.sliceoutoforder 選定隨機數r 將下標r和下邊i交換,i 就是和當前最後一位交換 方法2.rand.perm 陣列長度 將原陣列下標按照隨機出來的資料賦值給另一陣列 package main import fmt import math rand import tim...

golang中slice的擴容機制

在golang中slice是乙個指向陣列的指標結構體。這個結構體有三個屬性 其概念為 動態陣列 及陣列的容量大小 cap 會隨著陣列的實際大小 size 變化而變化 擴容 擴容機制 如果切片的容量小於1024個元素,那麼擴容的時候slice的cap就翻番,乘以2 一旦元素個數超過1024個元素,則乘...

golang中的空slice案例

package main func main 執行成功 補充 golang slice 詳解 func main var slice array 1 7 array startindex endindex 不包含endindex 2.直接建立陣列切片 slice2 make int,5,10 3.直...