Golang 数组传参
概念介绍
数组与切片
数组是具有相同唯一类型的一组已编号且长度固定的数据项序列。数组长度最大为2Gb,它是值类型。切片是对数组一个连续片段的引用,所以切片是一个引用类型。
按值传递和按引用传递
Go语言中函数的参数有两种传递方式,按值传递和按引用传递。Go默认使用按值传递来传递参数,也就是传递参数的副本。在函数中对副本的值进行更改操作时,不会影响到原来的变量。
按引用传递其实也可以称作”按值传递”,只不过该副本是一个地址的拷贝,通过它可以修改这个值所指向的地址上的值。
Go语言中,在函数调用时,引用类型(slice、map、interface、channel)都默认使用引用传递。
数组传递时的缺点
一般情况下,传递指针的消耗比传递副本的少,尤其是当数组特别大时。具体原因是:
- 值传递需要完整的复制初始数组并将这份拷贝放到栈中,这将耗费大量运行时间,因而值传递方式的效率比较低。
- 初始数组的拷贝需要占用额外的内存空间(栈中的内存)
- 编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。
如何避免
如上面介绍的,有两种方法,第一种利用指针,即引用传递;第二种使用切片,因为切片是引用类型,默认会使用引用传递。
使用指针进行传递
package mainimport "fmt"func main() {var arr = [5]int{1, 2, 3, 4, 5}fmt.Println(sum(&arr))
}func sum(arr *[5]int) int {s := 0for i := 0; i < len(arr); i++ {s += arr[i]}return s
}
使用切片进行传递
package mainimport "fmt"func main() {var arr = [5]int{1, 2, 3, 4, 5}fmt.Println(sum(arr[:]))
}func sum(arr []int) int {s := 0for i := 0; i < len(arr); i++ {s += arr[i]}return s
}
最后一种方法通常比较常用。
原文链接:https://blog.csdn.net/benben_2015/article/details/80884537
Golang 数组传参相关推荐
- 指针-数组传参,指针传参
目录 数组传参 一维数组 二维数组 指针传参 一级指针 二级指针 一个特殊的二级指针 数组传参 一维数组 我们把传入一维数组时输入的是数组名,数组名是一个指向首元素的指针 那么在函数接收时,只需要保证 ...
- 数组传参中形参的秘密,以及数组名当作函数实际参数的特点,以及二维数组,以及外部变量和全局变量
1.数组传参中形参的秘密 第三行:形参中不存在数组的概念,即便是中括号约定了数组的大小,也无效. 第二十行:传递的是一个地址,是数组的首地址. 数组名代表了整个数组的首地址. 第二十一行:第一个元素的 ...
- 在qt中用c语言数组,在QT函数中返回一个数组/把一个数组传参给函数
1.把数组传参给函数 可以定义一个QVector的一个数组 QVector num(10); for(int i =0;i<10;i++) num [i] = i*i; fun(num); / ...
- 《从缺陷中学习C/C++》——6.3 数组传参时的sizeof
本节书摘来自异步社区出版社<从缺陷中学习C/C++>一书中的第6章,第6.3节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区"异步社区&qu ...
- Golang Post传参调用示例
Golang Post传参 package mainimport ("fmt""net/http""io/ioutil""str ...
- 【让你从0到1学会C语言】指针/数组传参以及static关键字
作者:喜欢猫咪的的程序员 专栏:<C语言> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽. --<人民日报> ...
- 【C语言进阶】⑤关于数组传参和指针传参辨析
文章目录 一.数组 1.1.一维数组 1.2.二维数组 1.3.指针和数组 二.数组传参 2.1一维数组传参 2.2二维数组传参 2.3小结 三.指针传参 3.1一维指针传参 3.3二级指针传参 四. ...
- 一篇让你弄明白C语言指针传参和数组传参~
文章目录 前言 ⭐️指针传参和数组传参 ⭐️一维数组传参 ⭐️一级指针传参 ⭐️一道经典的指针传参相关题目 ⭐️二维数组传参 ⭐️函数指针!!! ⭐️一个有趣的代码!(*(void( * )())0) ...
- 【C语言】关于数组传参问题/首地址
数组在作为参数传递时,传递的是整个数组还是首地址呢? 先来看一段代码: void main() {int nums[] = { 1,2,3,4,5 };printf("&nums = ...
最新文章
- agentzh 的 Nginx 教程(版本 2015.03.19) 第一篇
- Linux中shell的介绍
- pls-00302: 必须声明 组件_vue学习手册-单文件组件使用
- CAS SSO实践中,目前解决的问题和有待解决的问题
- 孤立森林异常检测之入门
- SQL语句性能调整原则
- rf中resourceid_解决VC++ MFC程序resource.h头文件中ID重复问题
- Thread类的有关常用方法
- MUI框架:栅格系统 + grid宫格布局 - 案例篇
- 一步一步安装UEFI分区方式的windows 10 企业版
- java提取姓名_java获取类型名字的不同方法
- Android 进程的五种生命周期学习
- 一起来作画吧「GitHub 热点速览 v.22.14」
- 学校计算机总帐和明细帐的表格,5教学仪器设备总账和明细账填写模板.doc
- python之操作mysql数据库
- Bugku CTF 每日一题 想蹭网先解开密码
- CSS如何设置div半透明效果
- html添加鼠标右键菜单,Fabric.js - 添加鼠标右键点击事件响应(附:右键菜单)...
- matlab图像剪裁命令imcrop()
- Xshell6下载及安装