最近项目中有遇到类似问题,做个记录。

举个例子,[5]int为数组,[]int为slice(数组切片),数组是值类型,而slice为引用类型,值类型作为参数传入函数,只是拷贝了个副本,修改并不会作用到传入的那个参数,所以一般使用slice作为参数,免去了拷贝的消耗,但是有坑在里面,下面写例子说明。

1.slice作为参数

package mainimport "fmt"type DbItem struct {Id  int16Cnt int32
}func combineItem(itemList []DbItem, id int16, cnt int32) {item := DbItem{Id: int16(id), Cnt: int32(cnt)}itemList[0] = itemfmt.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)
}

运行结果如下:
combineItem itemList values: [{1 2} {0 0} {0 0} {0 0} {0 0}]
main itemList values: [{1 2} {0 0} {0 0} {0 0} {0 0}]

2.数组作为参数。

package mainimport "fmt"type DbItem struct {Id  int16Cnt int32
}func combineItem(itemList [5]DbItem, id int16, cnt int32) {item := DbItem{Id: int16(id), Cnt: int32(cnt)}itemList[1] = itemfmt.Printf("combineItem itemList values: %v \n", itemList)
}func main() {itemList := [5]DbItem{{Id: 3, Cnt: 4}}combineItem(itemList, int16(1), int32(2))fmt.Printf("main itemList values: %v \n", itemList)
}

运行结果如下:
combineItem itemList values: [{3 4} {1 2} {0 0} {0 0} {0 0}]
main itemList values: [{3 4} {0 0} {0 0} {0 0} {0 0}]

3.特别要注意,如果函数内使用了append,千万不要把参数当引用来用,会出问题。

 package mainimport "fmt"type DbItem struct {Id  int16Cnt int32}func combineItem(itemList []DbItem, id int16, 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, int16(1), int32(2))fmt.Printf("main itemList values: %v \n", itemList)}

运行结果如下:
combineItem itemList values: [{0 0} {0 0} {0 0} {0 0} {0 0} {1 2}]
main itemList values: [{0 0} {0 0} {0 0} {0 0} {0 0}]

具体原因参见:https://segmentfault.com/a/11...

golang中数组和slice作为参数的区别相关推荐

  1. 面试中常被问到(四)C/C++中数组,指针和引用的区别

    C/C++中数组,指针和引用的区别 数组和指针: 数组 指针 保存数据 保存数据地址 可直接访问元素的值 间接访问(首先获取指针内容作为地址,通过寻址找到元素的值) 一般大小固定,数据类型相同 一般用 ...

  2. C++中数组和指针的关系(区别)详解

    C++中数组和指针的关系(区别)详解 本文转自:http://c.biancheng.net/view/1472.html 博主在阅读后将文中几个知识点提出来放在前面: 没有方括号和下标的数组名称实际 ...

  3. golang中的空slice

    golang中允许对值为 nil 的 slice 添加元素 package mainfunc main() {var s []ints = append(s, 1) } 运行成功

  4. Golang中 int int8 int16 int32 int64的区别和取值范围

    先说结论吧,方便快速查询验证. 总结 区别 int 类型大小为 8 字节 int8 类型大小为 1 字节 int16 类型大小为 2 字节 int32 类型大小为 4 字节 int64 类型大小为 8 ...

  5. Js中数组的slice和splice方法

    slice()可以从数组中提取指定元素,指定元素为索引的方式              该方法不会改变本身的数组,而是将提取元素封装到新的数组返回              需要注意的是:       ...

  6. golang 中map 和slice 索引速度比较

    主文件 package mainvar max = 100 var Slice = make([]int, max+10) var Map = make(map[int]int)func init() ...

  7. python的数组和元组区别_python中数组,列表,元组的区别、定义、功能

    准确的来说,在python中是没有数组类型的,python中取而代之的是列表和元组.列表比元组好用,因为元组一旦定义就没法修改.而列表不仅可以和数组一样按索引访问,还有一堆的功能. 列表: (1)添加 ...

  8. python/numpy中数组array和矩阵matrix的区别

    在numpy中,array(实际上是ndarray,表示多维数组)是可以有多维度的,而matrix只有两个维度,即行和列.所以matrix是array的一种特例,因而它继承了array的所有函数,同时 ...

  9. Python中数组,列表,元组的区别、定义、功能

    准确的来说,在python中是没有数组类型的,python中取而代之的是列表和元组.列表比元组好用,因为元组一旦定义就没法修改.而列表不仅可以和数组一样按索引访问,还有一堆的功能. 列表: (1)添加 ...

最新文章

  1. 过去可忆,未来可期(随心录+杂记)
  2. insightface和facenet效果+性能比较
  3. Python线程、进程知识整理
  4. cetk使用方法--nand flash测试
  5. WinForm窗体中如何在一个窗体中取到另一个窗体的值
  6. pc个人微型计算机ppt,《IBMPC微型计算机》PPT课件.ppt
  7. spring cloud之Feign的使用
  8. es文件浏览器怎么用_ES文件浏览器VIP直装版
  9. Neo4j数据导入与可视化
  10. C语言数据结构--线性表
  11. (详细)VMware虚拟机安装Windows7镜像
  12. 固若金汤 - PostgreSQL pgcrypto加密插件
  13. python游戏dnf_招募:基于python的召唤师全时段全技能(含均值AI)计算器全程测试...
  14. 微信小程序安全需求基线
  15. 两阶段(two stage)目标检测原理详解 -- RCNN
  16. 最新解决方法This template did not produce a Java class or an interface
  17. k8s-存储-Secret
  18. 如何用excel做正交分析_利用Excel进行正交设计及分析.pdf
  19. python求列表list平均值的方法
  20. C语言 -指针 与解引用*

热门文章

  1. 一个没有意义的宇宙我们很难想象
  2. 性价比高出英特尔45%,亚马逊的云服务器芯片如何做到?| 解读
  3. “万维网之父”发文阐述其下一个网络时代:将数据与应用分离,互联网去中心化正在路上...
  4. 《2018中国大数据发展指数报告》发布:广东、上海、贵州、北京、重庆领先
  5. Nature:“解构”母爱
  6. 2018年看好这些半导体企业
  7. 过年期间:这个 GitHub 项目你必能用到
  8. JVM基础系列第7讲:JVM 类加载机制
  9. phpstudy下的mysql升级
  10. Myeclipse常用快捷键