• 一、结论
  • 二、为什么
  • 三、代码说明

一、结论

Golang 参数传递,全部是传值

二、为什么

  • 对于map,slice这样的类型,作为参数传递,明明是传值,但是在函数中修改值后,在原函数仍然能访问到修改后的值。
  • 如果你有C++基础,那么对于slice的理解,很容易就懂了,Slice的内部,就是这么个东东.
template<typename T>
class Slice {public:~Slice();Slice(size_t len , size_t cap)Slice(const Slice&v);// 下面这三个成员,非常的重要T* Data; //array of datassize_t Len;size_t Cap;
};
  • 函数之间的传值,是浅拷贝
  • 所以你在函数之间使用slice传值,是完全ok的,他们都共享Data指针(前提是append时,有足够的空间(cap),否则会生成新的slice,这个新的slice跟之前的,就没有一毛钱关系了)

三、代码说明

  • 我们通过一段go代码来展示,结论是否与上面的分析一致,详细的讲解,都在注释里面了,看懂下面的代码,你会更加了解go这个神奇的语言了。
func exampleFunc(arr []int) {arr[0] = 100//由于没有超过cap,所以不会生成新的slicearr = append(arr, 11111)
}
func main() {//创建一个int slicearr := make([]int, 2, 5)//fill idxfor i := 0; i < len(arr); i++ {arr[i] = i}//讲arr作为参数,传递到exampleFunc函数中exampleFunc(arr)for idx := range arr {fmt.Printf("idx=%d,value=%d\n", idx, arr[idx])}//获取slice的data,可以看到,我们在modify中的修改,已经成功了//但是由于exampleFunc函数的参数传的是arr的值,所以没法修改len和cap//所以你不能够使用for range来进行迭代输出,因为for range只会在 [0-len) 之间迭代//我们需要使用一段黑科技了hdr := (*reflect.SliceHeader)(unsafe.Pointer(&arr))//cast to [cap]intdata := *(*[5]int)(unsafe.Pointer(hdr.Data))//我们可以看到,底层的修改,已经成功了fmt.Println(data[2]) //exampleFunc函数扩展的元素,idx = 2
}

Golang 参数传递本质相关推荐

  1. golang channel本质——共享内存

    channel是golang中很重要的概念,配合goroutine是golang能够方便实现并发编程的关键.channel其实就是传统语言的阻塞消息队列,可以用来做不同goroutine之间的消息传递 ...

  2. 【GoLang】golang 最佳实践汇总

    最佳实践 1 包管理 1.1 使用包管理对Golang项目进行管理,如:godep/vendor等工具 1.2 main/init函数使用,init函数参考python 1.2.1 main-> ...

  3. C++ 中的指针参数传递和引⽤参数传递

    指针参数传递: 指针参数传递本质上是值传递,它所传递的是⼀个地址值.值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,会在栈中开辟内存空间以存放由主调函数传递进来的实参值,从⽽形成了实参的⼀ ...

  4. C/C++和python中的函数参数传递

    目录 一.C/C++中的函数参数传递 二.python中函数的参数传递问题 一.C/C++中的函数参数传递 1.C/C++中的普通参数传递和指针参数传递本质上都是值传递,只不过当使用指针接收实参传递的 ...

  5. python基础知识笔记简书_Python基础学习笔记

    Python貌似有点火热,上手还是比较简单的,自己找了个教程也偷偷的学习一下,扒了一下网上的图片和数据,感觉并不是很难呀(不过之前换电脑,代码丢了,有点可惜,不过网上教程一抓一大把,随便看看也能扒一些 ...

  6. Python基础知识(第六天)

    76.函数也是对象_内存分析 函数也是对象,内存底层分析 Python 中,"一切都是对象".实际上,执行 def 定义函数后,系统就创建了相应的函数对象.我们执行如下程序,然后进 ...

  7. 【C++】21.函数传参 传指针和传引用的区别

    指针传参 向函数传指针参数时,注意区分指针的指向(地址) 与 指针指向的地址中存放的值的区别: 改变形参指针的指向,实参指针指向不会变,实参指向的地址存放的值也不会变: 改变形参指针指向的地址中存放的 ...

  8. 二十万字C/C++、嵌入式软开面试题全集宝典一

    目录 1.引用和指针的区别? 2.从汇编层去解释一下引用 3.C++中的指针参数传递和引用参数传递 4.形参与实参的区别? 5.static的用法和作用? 6.静态变量什么时候初始化 7.const? ...

  9. 创建链表小细节(引用传递和值传递以及链表中的LinkList L、LinkList *L、LinkList L)

    函数参数传递的两种方式为值传递和引用传递 目录 函数参数传递的两种方式为值传递和引用传递 1.传值方式传参 2.引用方式传参 3.通过一段代码运行进一步理解传指针(包括二级指针)和传指针的引用 4.总 ...

  10. cpp知识汇总(1) 指针vs引用、static、const

    引用和指针的区别? 指针是一个实体,需要分配内存空间.引用只是变量的别名,不需要分配内存空间. 引用在定义的时候必须进行初始化,并且不能够改变.指针在定义的时候不一定要初始化,并且指向的空间可变.(注 ...

最新文章

  1. PHP5中的stdClass
  2. Unity学习笔记5 unity的js转c#
  3. mysql慢查询分析
  4. How to download BOM from ERP to CRM
  5. java clock计时_Java Clock类| systemDefaultZone()方法与示例
  6. java如何取到配置文件中值,从配置文件中获取配置信息的几种方法
  7. Alien Skin Exposure X6 mac汉化免费插件包胶片滤镜新功能介绍
  8. 栅栏密码加密/解密【W型】在线工具
  9. linux开发工具少_从设计到开发,我必不可少的10种工具
  10. Word中公式编辑的快捷键
  11. Kafka: Consumer
  12. python网络爬虫技术课后答案_尔雅《Python网络爬虫技术(2020年秋季学期)》网课答案...
  13. 当 Python 遇到数据库,这个模块就变得超级好用
  14. ios 开发证书导出p12文件_如何生成苹果开发者证书及描述文件
  15. Flink学习:WaterMark
  16. Python基础班开班典礼
  17. 飞思卡尔 熟悉小车之 舵机篇
  18. crx2rnx格式转换
  19. 判断用户输入的数为正数还是负数
  20. GetLastError()10013错误解决方法及错误列表

热门文章

  1. 卡特兰数(JAVA大数)Buy the Ticket
  2. awk字符串匹配与传参
  3. 无法使用闩锁类型 sh 读取并闩锁页_InnoDB数据锁第2.5部分“锁”(深入研究)...
  4. java 001 002_java笔记0x002:操作符
  5. android图片布局填冲满,Android的布局图像填充宽度
  6. react取消捕获_React生命周期
  7. Linux用管道移动文件夹,linux常用命令(示例代码)
  8. python 登录接口测试_Python接口测试——post请求(登录接口)
  9. python编写骰子和的程序_简单掷骰子程序发行
  10. java8 转 java7,spnego.jar从Java 7切换到Java 8强制转换异常