golang 结合实例更好的理解参数传递和指针
关于参数传递
其实go的参数传递,核心就是一句话:go里所有参数传递都是值传递,既把参数复制一份放到函数里去用。
go的函数传参,不管参数是什么类型,都会复制一份,然后新的参数在函数内部被使用。
不像其他语言,有的时候传参只是传递一个原来参数的引用(引用和指针的区别,欢迎翻看我上上上上一篇分享),在函数内部操作变量,其实还是操作的原变量。go内不会直接的操作原变量。
关于指针
相比于C里的指针,go内部的指针一个被简化过的指针,指针可以取值获取其变量;变量可以取地址获取一个指针类型的值。 但是不可以对指针执行 地址的加减操作(unsafe.Pointer 可以,不在本次讨论范围之内)。
我觉得这个简化挺好,保留了参数传递时避免大变量的优势,又去掉了复杂性。
下面来通过实例具体说明
之所以用 切片做示例,是因为 切片是引用类型,也就是说切片内部有一个指针 指向底层放数据的数组。 类似于 一个指针变量。由于它的这个特性,更能说明问题。
错误示例1
package main
import "log"
var str []string
func main() {
setVal(str)
log.Println(str)
}
//需要在这里赋值str,但是又不能直接引用 str
func setVal(val []string) {
val = []string{"a", "b"}
}
结果是空数组
虽然切片是引用类型,还是没有复制成功。 原因就是,在传参之前 这个切片并没有被赋值,它内部的指针是一个空的。
传参的时候,复制了一个切片变量,这个新的变量 指向setVal函数内的实例变量。但是setVal 内的操作并不影响原来的切片变量。
错误示例2
package main
import "log"
var str *[]string
func main() {
setVal(str)
log.Println(str)
}
//需要在这里赋值str,但是又不能直接引用 str
func setVal(val *[]string) {
val = &[]string{"a", "b"}
}
这个例子,看似使用了指针,不仔细就得话,可能觉得指针作为参数应该会对原参数产生效果,但其实不会,最后的结果是 nil。
其错误原因与上一个例子基本一致,虽然传递的是一个 指针。但是 这个指针只是原参数的复制品,一个新的指针,由于参数传递时,指针并没有复制,这个新的指针跟原来的指针毫无关系。
正确版本:
package main
import "log"
var str []string
func main() {
setVal(&str)
log.Println(str)
}
//需要在这里赋值str,但是又不能直接引用 str
func setVal(val *[]string) {
*val = []string{"a", "b"}
}
注意看main 函数,这个时候原参数是一个变量,main 函数内作为参数的是这个变量的地址,同时也是一个指针变量。在setVal内复制了一个指针变量,其值同样是这个原参数的地址。所以这个例子里setVal 函数内的形参指针进行取值, 会取到原参数,所以其操作会对原参数产生影响。
总结
没啥好总结的了,总结都被写在前边了,还总结个毛线 ~ ~
golang 结合实例更好的理解参数传递和指针的更多相关文章
- 重学Golang系列(一): 深入理解 interface和reflect
前言 interface(即接口),是Go语言中一个重要的概念和知识点,而功能强大的reflect正是基于interface.本文即是对Go语言中的interface和reflect基础概念和用法的一 ...
- 嗯 第二道线段树题目 对左右节点和下标有了更深的理解 hdu1556
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- 通过Ruby On Rails 框架来更好的理解MVC框架
通过Ruby On Rails 框架来更好的理解MVC框架 1.背景 因为我在学习软件工程课程的时候,对于 MVC 框架理解不太深入,只是在理论层面上掌握,但是不知道如何在开发中使用 MVC ...
- dimensionality reduction动机---visualization(将数据可视化帮助我们更好地理解数据)
如果我们能更好地理解我们的数据,这样会对我们开发高效的机器学习算法有作用,将数据可视化(将数据画出来能更好地理解数据)出来将会对我们理解我们的数据起到很大的帮助. 高维数据如何进行显示 GDP: gr ...
- 帮助你更好的理解Spring循环依赖
网上关于Spring循环依赖的博客太多了,有很多都分析的很深入,写的很用心,甚至还画了时序图.流程图帮助读者理解,我看了后,感觉自己是懂了,但是闭上眼睛,总觉得还没有完全理解,总觉得还有一两个坎过不去 ...
- 技术干货 | 基于MindSpore更好的理解Focal Loss
[本期推荐专题]物联网从业人员必读:华为云专家为你详细解读LiteOS各模块开发及其实现原理. 摘要:Focal Loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失 ...
- 【转载】C/C++杂记:深入理解数据成员指针、函数成员指针
原文:C/C++杂记:深入理解数据成员指针.函数成员指针 1. 数据成员指针 对于普通指针变量来说,其值是它所指向的地址,0表示空指针.而对于数据成员指针变量来说,其值是数据成员所在地址相对于对象起始 ...
- 深入理解C语言 - 指针使用的常见错误
在C语言中,指针的重要性不言而喻,但在很多时候指针又被认为是一把双刃剑.一方面,指针是构建数据结构和操作内存的精确而高效的工具.另一方面,它们又很容易误用,从而产生不可预知的软件bug.下面总结一下指 ...
- Golang入门教程(二)Ubuntu16.04下安装golang(实例:Golang 定时任务管理器)
通过两种方式安装 一.通过apt-get安装1.安装 sudo apt-get install golang 2.设置GOPATH变量 GOPATH是扩展库的目录,Go先搜索标准库目录,然后搜索GOP ...
随机推荐
- 使用纯js写的一个分页
上图晒效果: 网上确实有很多分页的插件以及开源代码,单本是一个后台开发猿,前台css等样式还驾驭不住,所以就开始自己去写了.其实这个分页原理很简单,就是用ajax往后台传值(当前页码),后台使用lim ...
- Java连接MYSQL进行操作(增,删,改)
连接数据库,并用表格输出数据 创建insex.jsp <table border="1" width="80%" align='center'> & ...
- @Bean 注解全解析
目录 @Bean 基础声明 @Bean 基本构成及其使用 @Bean 注解与其他注解产生的火花 @Profile 注解 @Scope 注解 @Lazy 注解 @DependsOn 注解 @Primar ...
- TCP传输协议中如何解决丢包问题
TCP在不可靠的网络上实现可靠的传输,必然会有丢包.TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题. 但是许多人有不同的 ...
- web前端笔试篇(一)
[ 题外话 ]:本博主作为一名准毕业生,即将面临毕业就业问题,即将到大四了,不准备考研的我,那么该去干嘛呢?毫无疑问,那就是实习,那么即使是实习,那么在要想进入自己心仪的企业之前,笔试这一关终究是无法 ...
- RabbitMQ从入门到精通(三)
目录 1. 自定义消费者使用 自定义消费端演示 2.消费端的限流策略 2.1 限流的场景与机制 2.2 限流相关API 2.3 限流演示 3. 消费端ACK与重回队列机制 3.1 ACK与NACK 3 ...
- 如何处理MySQL经常出现CPU占用率达到99%
如何处理MySQL经常出现CPU占用率达到99% 情况说明: 最近在自己购买的linux服务器上捣鼓了一个小项目,按理说不存在CPU占用率会达到100%的情况,但事实就是经常出现. 然后,我第一反应是 ...
- nginx文件名逻辑漏洞_CVE-2013-4547漏洞复现
nginx文件名逻辑漏洞_CVE-2013-4547漏洞复现 一.漏洞描述 这个漏洞其实和代码执行没有太大的关系,主要原因是错误地解析了请求的URL,错误地获取到用户请求的文件名,导致出现权限绕过.代 ...
- 【halcon教程资料】全网汇总如何快速、高效率学习机器视觉从入门到精通
我以八年的视觉工程师开发的工作经验告诉你,你不要再因为学习halcon发愁了,我接触过很多学习halcon的小白,并不是不愿意学,而是不知道怎么快速.高效率的学习精通,一天天的过去了,对学习halco ...
- datatables editor fields type
其实editor fields type 默认支持的输入类型就是w3c输入框类型. text number password textarea select checkbox ...