[Golang]slice值传递存在的问题

说明

因为slice是指针类型,所以很多人会误以为其传递的是引用,所以在使用的过程中会出现一些非期望的实现。

问题

在使用append函数时,比如以下函数:

func sliceModify(slice []int) {// slice[0] = 88slice = append(slice, 6)
}
func main() {slice := []int{1, 2, 3, 4, 5}sliceModify(slice)fmt.Println(slice)
}
// [1 2 3 4 5]

为什么append的数组在外部没有改变呢,因为slice传的是值,虽然改变了底层数据,但是外部slice的状态并没改变。也许有人质疑值语义,但是有以下代码

func modifySlice(data []int) {data = nil
}
func main() {a := []int{1,2,3}fmt.Println(a)modifySlice(a)fmt.Println(a)
}
// [1, 2, 3]
// [1, 2, 3]

从上面代码可以看到,改变slice本身的值并不会改变外部的值,及是值语义。

那么如何解决值传递带来的问题,解决方法一,就是将slice作为指针传递:

func sliceModify(slice *[]int) {*slice = append(*slice, 6)
}
func main() {slice := []int{1, 2, 3, 4, 5}sliceModify(&slice)fmt.Println(slice)
}

指针会改变原本变量的状态,所以外部的slice发生了改变。

另一种解决方法是改变外部变量的状态,如下代码:

func main() {    s1 := make([] int ,3,5)    s1[0] = 1 s1[1] = 2    fmt.Println(s1)     s2 :=s1[:4]  
}   
func test( s [] int )  {    s = append(s,3)   fmt.Println(s)
}
//[1 2 0 3]
//[1 2 0]
//[1 2 0 3]

虽然在函数内修改slice但是只是添加到了内存中,所以在函数中内printf出来,但是外部的len没有改变,所以不会显示,如果强制改变其状态,那么添加的值也就显露出来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/381528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IE8给你选择的理由

记得第一次用电脑时的情景,有点兴奋,双手不知道往哪里放,还有点局促和不安,怕不小心弄坏了它。也记得第一次上网,那个时候的上网就是用浏览器去访问在线聊天室,去和不认识的人去聊天,在网络信息…

流畅的python目录_流畅的python python 序列

内置序列 容器类型 list 、tuple和collections.deque这些序列能放入不同的类型的数据 扁平序列 str、byets、bytearray、memoryview(内存视图)和array.array(数组) 可变序列 list、bytearray、array.array、collections.deque和memoryview 不可变序列 tuple、str和bytes 可变序…

[Golang] 用interface{}实现泛型出现的问题

说明 在做一些实现的时候,碰到了一个棘手的问题,问题是这样的,向一个函数里传入slice和begin,end,返回slice[begin:end]。很明显这是一个实现泛型的问题,但是在做具体实现的时候出现问题。 问题 根据问题,很容易写下如…

dwf怎么合成一个_将ActionForm拼合成一条插入和更新语句

package chs.jhsyss.form;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.Date;public class Waper {public Waper(){}/*** 本方法用于将FORM对象组装成一条INSERT语句* param obj ActionForm 以及其子对象* param for…

WebHelper类

成员一:获取上下文对象: public static HttpContext GetContext() { HttpContext context HttpContext.Current; if (context null) { throw new Exception("HttpContext not found"…

关联查询数据重复怎么办_在设计数据表的时候,是一个宽表好,还是多个维度表好?...

数据仓库每张表的搭建,主要依赖于这个表在整个数据仓库中的作用和相关意义。首先要清楚这个表的存在是为了解决那些问题,什么角色使用,怎么保证使用者尽可能好的体验解决问题。从以上所提到的角度去看待问题,拆解以下几点因素&…

[Beego] [bootstrap-paginator]实现分页功能

说明 在开发中分页功能几乎是必不可少的一项功能,使用beego框架开发时,就遇到了分页功能的需求。可能是之前版本并不支持,我发现有很多自己实现的分页功能的封装,在阅读了官方源码时,我发现了分页功能的封装&#xff0…

电磁波传播相位是否会变化_相位常数β与波数k是一回事吗?

1.相位常数β与波数k先明确一点:相位常数是指传输线,而波数是指平面波。1.1. 波数k wavenumber波数k:单位长度上有多少弧度?Jun.14.2019电磁波在材料中以光速 运动:材料的磁导率:材料的介电常数in free spa…

c#获取系统时间的方法

转:http://bbs.bc-cn.net/viewthread.php?tid238469 //今天DateTime.Now.Date.ToShortDateString();//昨天,就是今天的日期减一DateTime.Now.AddDays(-1).ToShortDateString();//明天,同理,加一DateTime.Now.AddDays(1).ToShortDateString()…

用python画出叶子_太疯狂了!原来用粉笔画画,也可以这么美,简单几招教你,美到邻居羡慕嫉妒...

......点进来之前先让大家瞧瞧相信这是用粉笔画的吗?▼玫瑰花▼山茶花▼蓝色鸢尾花▼樱花树▼这一张张让人直流鼻血的作品没错这就是用色粉笔画出来的很多人问:是不是平时老师上课时用的粉笔呢?这里给大家科普下:色粉画&#xff0…

jsonp react 获取返回值_必须要会的 50 个React 面试题(下)

翻译:疯狂的技术宅原文:https://www.edureka.co/blog/interview-questions/react-interview-questions29. 你对受控组件和非受控组件了解多少?受控组件非受控组件1. 没有维持自己的状态1. 保持着自己的状态2.数据由父组件控制2.数据由 DOM 控…

ASP.Net ListBox DropdownList 不同条目 设置 背景色 和 字体颜色

转载于:https://www.cnblogs.com/sjcatsoft/archive/2008/11/08/1329787.html

[jQuery] 根据表单的不同参数跳转不同的链接

说明 在实现前端的时候,我们有些需求是这样的: 1. 需要表单来向服务端get或post参数 2. 表单数据不只一个 3. 需要根据不同的提交的数据参数、类型等信息提交到不同 思路 把请求放到后端处理是可以的,但是显然这样处理会增加系统的复杂度&…

snipaste截图软件滚动截图_截图工具的逆袭,Snipaste 还可以这么玩

这是我们的历史文章。为让大家更好找到自己需要的软件,我们会在三条位置推送,那些备受关注的APP和软件。提到「截图」大家会想到什么呢?微信,QQ 或者 功能更加完善的截图工具?有想过「截图」可以这样用吗?还…

python的函数_Python 返回函数+匿名函数

返回函数 粗粗看了一遍学习资料,感觉返回函数的意思好理解,但是实际应用起来就有点麻烦了。 先捋一捋思路叭。 首先,高阶函数除了能接收函数作为参数外,也能将函数作为结果值返回。 函数作为返回值 拿 求和 做个简单的例子&#x…

简述WebService与.NET Remoting的区别及适应场合

为了能清楚地描述Web Service 和Remoting之间的区别,我打算从他们的体系结构上来说起: Web Service大体上分为5个层次: 1. Http传输信道 2. XML的数据格式 3. SOAP封装格式 4. WSDL的描述方式 5. UDDI 总体上来讲,.NET 下的 Web Service结构比较简单,也比…

[Golang]计算一个文件的MD5值

说明 在实际的开发过程中,总需要对文件进行md5加密的需求,在开发过程中,我就遇到了将表单文件MD5后再存储本地的需求。 解决 MD5的所需要的包在”crypto/md5”包中,需要先实例化一个MD5对象,然后在此基础上调用sum方法…

lisp捕捉垂足_定位-'Cal计算器

命令CAL,右键菜单选择“快速计算器”或CTRL8都可以打开计算器。使用 CAL 命令,用户可以:一.)获取点1.使用光标获取点用 cur 函数。程序会提示用户指定点并使用当前的 UCS 点的坐标值。cur 函数用于设置系统变量 lastpoint的值。2.获取交点ill…

plsql developer无监听程序_微信小程序支持分享到朋友圈啦!技术解读跟我来

千呼万唤始出来!微信小程序页面分享到朋友圈的功能,终于在安卓系统灰度测试了!目前只在安卓系统!只在安卓系统!只在安卓系统!iOS系统还没有办法体验。首先,我们看一下官方文档的描述&#xff0c…

色彩的搭配

色彩的搭配是一门艺术,灵活运用它能让你的主页更具亲和力。当然这篇文章的内容还只限于理论,要想真的制作出漂亮的网页则需要灵活运用加上自己的创意才行。如果你有什么收获的话,可别忘了介绍给广大读者啊。 色彩的含义   色彩本身…