概念介绍

数组与切片

数组是具有相同唯一类型的一组已编号且长度固定的数据项序列。数组长度最大为2Gb,它是值类型。切片是对数组一个连续片段的引用,所以切片是一个引用类型。

按值传递和按引用传递

Go语言中函数的参数有两种传递方式,按值传递和按引用传递。Go默认使用按值传递来传递参数,也就是传递参数的副本。在函数中对副本的值进行更改操作时,不会影响到原来的变量。
按引用传递其实也可以称作”按值传递”,只不过该副本是一个地址的拷贝,通过它可以修改这个值所指向的地址上的值。
Go语言中,在函数调用时,引用类型(slice、map、interface、channel)都默认使用引用传递。

数组传递时的缺点

一般情况下,传递指针的消耗比传递副本的少,尤其是当数组特别大时。具体原因是:

  1. 值传递需要完整的复制初始数组并将这份拷贝放到栈中,这将耗费大量运行时间,因而值传递方式的效率比较低。
  2. 初始数组的拷贝需要占用额外的内存空间(栈中的内存)
  3. 编译程序需要专门产生一部分用来复制初始数组的代码,这将使程序变大。

如何避免

如上面介绍的,有两种方法,第一种利用指针,即引用传递;第二种使用切片,因为切片是引用类型,默认会使用引用传递。

使用指针进行传递

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. 指针-数组传参,指针传参

    目录 数组传参 一维数组 二维数组 指针传参 一级指针 二级指针 一个特殊的二级指针 数组传参 一维数组 我们把传入一维数组时输入的是数组名,数组名是一个指向首元素的指针 那么在函数接收时,只需要保证 ...

  2. 数组传参中形参的秘密,以及数组名当作函数实际参数的特点,以及二维数组,以及外部变量和全局变量

    1.数组传参中形参的秘密 第三行:形参中不存在数组的概念,即便是中括号约定了数组的大小,也无效. 第二十行:传递的是一个地址,是数组的首地址. 数组名代表了整个数组的首地址. 第二十一行:第一个元素的 ...

  3. 在qt中用c语言数组,在QT函数中返回一个数组/把一个数组传参给函数

    1.把数组传参给函数 可以定义一个QVector的一个数组 QVector num(10); for(int  i =0;i<10;i++) num [i] = i*i; fun(num); / ...

  4. 《从缺陷中学习C/C++》——6.3 数组传参时的sizeof

    本节书摘来自异步社区出版社<从缺陷中学习C/C++>一书中的第6章,第6.3节,作者: 刘新浙 , 刘玲 , 王超 , 李敬娜 , ,更多章节内容可以访问云栖社区"异步社区&qu ...

  5. Golang Post传参调用示例

    Golang  Post传参 package mainimport ("fmt""net/http""io/ioutil""str ...

  6. 【让你从0到1学会C语言】指针/数组传参以及static关键字

    作者:喜欢猫咪的的程序员 专栏:<C语言> 喜欢的话:世间因为少年的挺身而出,而更加瑰丽.                                  --<人民日报> ...

  7. 【C语言进阶】⑤关于数组传参和指针传参辨析

    文章目录 一.数组 1.1.一维数组 1.2.二维数组 1.3.指针和数组 二.数组传参 2.1一维数组传参 2.2二维数组传参 2.3小结 三.指针传参 3.1一维指针传参 3.3二级指针传参 四. ...

  8. 一篇让你弄明白C语言指针传参和数组传参~

    文章目录 前言 ⭐️指针传参和数组传参 ⭐️一维数组传参 ⭐️一级指针传参 ⭐️一道经典的指针传参相关题目 ⭐️二维数组传参 ⭐️函数指针!!! ⭐️一个有趣的代码!(*(void( * )())0) ...

  9. 【C语言】关于数组传参问题/首地址

    数组在作为参数传递时,传递的是整个数组还是首地址呢? 先来看一段代码: void main() {int nums[] = { 1,2,3,4,5 };printf("&nums = ...

最新文章

  1. agentzh 的 Nginx 教程(版本 2015.03.19) 第一篇
  2. Linux中shell的介绍
  3. pls-00302: 必须声明 组件_vue学习手册-单文件组件使用
  4. CAS SSO实践中,目前解决的问题和有待解决的问题
  5. 孤立森林异常检测之入门
  6. SQL语句性能调整原则
  7. rf中resourceid_解决VC++ MFC程序resource.h头文件中ID重复问题
  8. Thread类的有关常用方法
  9. MUI框架:栅格系统 + grid宫格布局 - 案例篇
  10. 一步一步安装UEFI分区方式的windows 10 企业版
  11. java提取姓名_java获取类型名字的不同方法
  12. Android 进程的五种生命周期学习
  13. 一起来作画吧「GitHub 热点速览 v.22.14」
  14. 学校计算机总帐和明细帐的表格,5教学仪器设备总账和明细账填写模板.doc
  15. python之操作mysql数据库
  16. Bugku CTF 每日一题 想蹭网先解开密码
  17. CSS如何设置div半透明效果
  18. html添加鼠标右键菜单,Fabric.js - 添加鼠标右键点击事件响应(附:右键菜单)...
  19. matlab图像剪裁命令imcrop()
  20. Xshell6下载及安装

热门文章

  1. 脚本编程语言python语言-python语言是脚本语言吗
  2. python之禅中文-Python之禅与翻译之美
  3. 如何查看python是多少位的-请问一下该怎么查看python是32位还是64位?
  4. python是c语言写的吗-python是c语言开发的吗
  5. python读取csv文件的方法-python读写csv文件的方法
  6. python语言能干什么-学Python语言可以做什么?
  7. 学python编程-趣学Python编程
  8. javascript高级程序设计之BOM
  9. LeetCode Sudoku Solver
  10. libevent中的基本数据结构