golang中数组和slice作为参数的区别
最近项目中有遇到类似问题,做个记录。 举个例子,[5]int为数组,[]int为slice(数组切片),数组是值类型,而slice为引用类型,值类型作为参数传入函数,只是拷贝了个副本,修改并不会作用到传入的那个参数,所以一般使用slice作为参数,免去了拷贝的消耗,但是有坑在里面,下面写例子说明。 1.slice作为参数 package main import "fmt" type DbItem struct { Id int16 Cnt int32 } func combineItem(itemList []DbItem,id int16,cnt int32) { item := DbItem{Id: int16(id),Cnt: int32(cnt)} itemList[0] = item fmt.Printf("combineItem itemList values: %v n",itemList) } func main() { itemList := make([]DbItem,5) combineItem(itemList,int16(1),int32(2)) fmt.Printf("main itemList values: %v n",itemList) } 运行结果如下: 2.数组作为参数。 package main import "fmt" type DbItem struct { Id int16 Cnt int32 } func combineItem(itemList [5]DbItem,Cnt: int32(cnt)} itemList[1] = item fmt.Printf("combineItem itemList values: %v n",itemList) } func main() { itemList := [5]DbItem{{Id: 3,Cnt: 4}} combineItem(itemList,itemList) } 运行结果如下: 3.特别要注意,如果函数内使用了append,千万不要把参数当引用来用,会出问题。 package main import "fmt" type DbItem struct { Id int16 Cnt int32 } func combineItem(itemList []DbItem,cnt int32) { item := DbItem{Id: int16(id),Cnt: int32(cnt)} itemList = append(itemList,item) fmt.Printf("combineItem itemList values: %v n",itemList) } func main() { itemList := make([]DbItem,5) combineItem(itemList,int32(2)) fmt.Printf("main itemList values: %v n",itemList) } 运行结果如下: 具体原因参见:https://segmentfault.com/a/11... (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |