Go 函数参数传递详解前言:go语言函数参数为值拷贝(指针参数为指针拷贝) 。
在go语言中,函数也作为一种数据类型,所以函数也可以作为函数的参数来使用 。
其中slice是为地址数组指针的拷贝??,持续更新中 ....
GO 一文搞懂指针和地址值的区别 go语言中的指针和地址值 , 在使用上常常具有迷惑性,主要是其特殊的*、符号的使用,可能会让你摸不透 , 本文希望能讲清楚go语言的指针(pointer)和值(value) 。
这里先简单的对指针和地址值概念做一个定义:
这是因为go方法传递参数的方式导致的 , go方法函数传递参数传递的是一个拷贝,看看下面的程序会输出什么?
答案是8,而不是9,因为AddAge函数修改的是学生的一个备份 , 而不是原始的学生对象
如果你想正确的给学生年龄增加的话,函数传递的需要是这个值的指针,如下所示:
需要注意的是,这里我们的指针传递的仍然是一个拷贝,比如,如果你将s赋值给另外一个指针地址,不会影响原有的指针,这点可以自行实践下 。
那在使用go语言开发的时候,何时该用指针何时改用地址值呢?比如考虑以下场景:
简单原则: 当你不确定该使用哪种的时候 , 优先使用指针
如果考虑在数组、切片、map等复合对象中使用指针和值,比如:
很多开发者会认为b会更高效,但是被传递的都是一个切片的拷贝,切片本身就是一个引用,所以这里被传递的其实没有什么区别 。
对于指针和地址值的使用,大家需要牢记的一点就是go数据传递的不可变性,活学活用此特点,在无状态函数中此特性非常有用 。
浅谈Go语言函数与方法的区别前段时间,我们实验室用go作为后台开发语言开发了一个web项目,由于这是自己第一次使用go语言进行开发,在开发过程中,一味着追求完成任务 , 在编码的时候没有太注重性能,虽然勉强实现了功能 , 但是对go语言的理解还是比较浅显的 。下面来谈谈自己对go语言中函数与方法的理解 。
普通函数:
go函数可以返回多个值
值传递: 值传递是指在调用函数时将实际参数复制一份传递到函数中,这样函数中如果对参数进行修改 , 将不会影响到实际参数
引用传递: 引用传递是指在调用函数将实际参数的地址传递到函数中,那么在函数中对参数进行的修改 , 将影响到实际参数 。
一般来说go语言函数的 接收者(也就是形参)一般放在函数名后面 , 不能将指针类型的数据直接传递,也就是说函数形参如果是值类型,调用者必须使用值作为实参过来 , 如果函数形参是指针类型,则函数调用者需使用指针作为实参来调用 。
普通方法:
接收者是在func关键字后面,而不是在函数名称后面,接收者可以是自己定义的一个类型,这个类型可以是struct、interface,一个方法就是一个包含了接收者的函数,接收者可以是命名类型或者是结构体类型的一个值或者是一个指针 。
下面是一个例子来说明方法和函数的区别(重点)
golang-101-hacks(12)——切片作为函数参数传递注:本文是对 golang-101-hacks 中文翻译 。
在Go语言中go语言函数参数传递方式,函数参数是值传递 。使用slice作为函数参数时 , 函数获取到go语言函数参数传递方式的是slicego语言函数参数传递方式的副本:一个指针,指向底层数组go语言函数参数传递方式的起始地址,同时带有slice的长度和容量 。既然各位熟知数据存储的内存的地址,现在可以对切片数据进行修改 。让我们看看下面的例子:
In Go, the function parameters are passed by value. With respect to use slice as a function argument, that means the function will get the copies of the slice: a pointer which points to the starting address of the underlying array, accompanied by the length and capacity of the slice. Oh boy! Since you know the address of the memory which is used to store the data, you can tweak the slice now. Let's see the following example:
运行结果如下
由此可见,执行modifyValue函数,切片s的元素发生了变化 。尽管modifyValue函数只是操作slice的副本 , 但是任然改变了切片的数据元素 , 看另一个例子:
You can see, after running modifyValue function, the content of slice s is changed. Although the modifyValue function just gets a copy of the memory address of slice's underlying array, it is enough!
【go语言函数参数传递方式 golang 参数传递】See another example:
The result is like this:
而这一次,addValue函数并没有修改main函数中的切片s的元素 。这是因为它只是操作切片s的副本,而不是切片s本身 。所以如果真的想让函数改变切片的内容 , 可以传递切片的地址:
This time, the addValue function doesn't take effect on the s slice in main function. That's because it just manipulate the copy of the s, not the "real" s.
So if you really want the function to change the content of a slice, you can pass the address of the slice:
运行结果如下
go语言函数参数传递方式的介绍就聊到这里吧,感谢你花时间阅读本站内容 , 更多关于golang 参数传递、go语言函数参数传递方式的信息别忘了在本站进行查找喔 。
推荐阅读
- 爬虫封了ip,如果网站封禁了本机爬虫的ip,该如何处理?
- sapmba的简单介绍
- g5e冒险解谜游戏安卓,g5游戏破解版安卓无限钻石版
- 00后无本创业代理平台,无本创业是什么
- Python函数使用格式的简单介绍
- 购买微信公众号带微信支付,公众号可以付款买东西吗
- 手机显示屏为什么是黑色的,手机屏幕显示为什么是黑色
- 钉钉直播专业工具,钉钉直播工具栏
- php二维数组增加数据 php二维数组赋值