Go语言中常见100问题-#24 Not making slice copies correctly

#### 如何正确的对切片进行拷贝

内置的 copy 函数实现了将源切片中的数据拷贝到目标切片中的功能,尽管这是一个常用的内置函数,但是还是有不少开发者使用有误。下面会通过具体的例子说明 copy 的错误使用。如下代码中期望通过 copy 函数将源切片 src 中的数据拷贝到目标切片 dst中,猜猜程序打印的内容是什么?

```golang

src := []int{0, 1, 2}

var dst []int

copy(dst, src)

fmt.Println(dst)

```

执行上述程序,输出内容是[], 并不是我们预期的[0 1 2], 为啥呢?这需要对copy有深入的理解。copy函数将源切片中的数据拷贝到目标切片时,拷贝的元素个数为下面两个长度中较小的一个。

+ 源切片的长度

+ 目标切片的长度

在前面的代码中,源切片src的长度为3,但是目标切片dst的长度为0,因此,调用copy函数拷贝的元素个数为0,所以打印输出为空切片。

如果我们想进行完整的拷贝,目标切片的长度必须不小于源切片的长度。像下面这样,将目标切片的长度设置为与源切片一样长,这时打印输出内容为[0 1 2].

```golang

src := []int{0, 1, 2}

dst := make([]int, len(src))

copy(dst, src)

fmt.Println(dst)

```

***NOTE:另一个常犯的错误是颠倒了调用copy函数参数顺序。记住第一个参数表示将元素拷贝到的目标位置,第二参数是源数据的位置。***

此外,需要了解拷贝元素并不是只有调用copy函数一种方式,在其他实现方法中最广泛熟知的是下面这种通过append函数的方法。将源切片append到一个nil切片中,这时将创建一个长度为3,容量为3的目标切片。相比前一种方法,这种方法优势是代码简短,只需要一行代码。但是使用copy更地道,更容易理解。

```golang

src := []int{0, 1, 2}

dst := append([]int(nil), src...)

```

总结,将一个切片中的元素拷贝到另一个切片是一种非常频繁的操作,当我们使用copy函数时,需要记得拷贝的元素个数是源切片和目标切片中长度较短的。此外,需要知道拷贝元素并不是只有copy一种方法,在代码库中看到其它拷贝元素方法时不要惊讶。

本文转载于网络 如有侵权请联系删除

相关文章

  • 国际设计大师女裙之王罗兰·穆雷来云南向白族阿妈学艺 |文创采风

    西方世界从不缺乏对东方之美的想象。历史上,曾表现为17世纪末欧洲社会兴起的对中国风(Chinoiserie)的狂热与追捧,欧洲的上流社会沉浸在对中国式样、东方审美情趣的情调之中,这对后期洛可可艺术风格的诞生直接起到了推波助澜的影响。虽然欧洲宫廷的中国风,充满着对东方艺术的误读与幻象,但其流行范围之广、影响程度之深足以让我们窥见东方美学之于西方世界,其巨大的魅力与价值。这本身,就是对东方之美的一种赞颂。当今,东方艺术正以不可阻挡之势,再一次走向世界。2019年,因着对手工艺艺术的热爱与帮助低收入手工艺女性的共同愿景,妈妈制造已联合腾讯文创与英国顶级时尚品牌ROLANDMOURET团队达成合作,将对中国传统手工艺的保护与创新,推及到更高的高度,首发阵容强大!4月15日,ROLANDMOURET及其团队受邀来访中国,深入考察扎根在中国大地、传承千年的中国传统手工艺,全面探索中西方在工艺设计、艺术理念创新合作方面的可能,开启了为期6天的考察。团队此次考察纪实考察首站:云南大理探访古老而迷人的扎染艺术考察首站,采风团队一起来到大理的扎染之乡,在远在滇西北的民族村,与白族的民间艺术——扎染,展开一

  • LeetCode题组:第9题-回文数

    1.题目:回文数 判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例1:输入:121 输出:true 示例2:输入:-121 输出:false 解释:从左向右读,为-121。从右向左读,为121-。因此它不是一个回文数。 示例3:输入:10 输出:false 解释:从右向左读,为01。因此它不是一个回文数。 2.我的解答:#include<stdio.h> //函数申明 boolisPalindrome(intx); boolisPalindrome(intx){ if(x<0)returnfalse; longy=0; inttemp=x; while(temp){ y=y*10+temp%10; temp=temp/10; } if(x==y)returntrue; elsereturnfalse; } intmain() { intx=12321; printf("%d\n",isPalindrome(x)); return0; }复制3.题目进阶 将整数转为字符串

  • Flutter Widgets 之 ListWheelScrollView

    注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本:1.12.13+hotfix.5 Dart版本:2.7.0基础用法在展示大量数据的时候我们第一会想到使用ListView,如果你觉得ListView比较单一、枯燥,你可以使用ListWheelScrollView,ListWheelScrollView和ListView同源,但它的渲染效果类似于车轮(或者滚筒),它不是在平面上滑动,而是转动车轮,先来看一波效果:ListWheelScrollView的用法和ListView基本相同,基础用法:ListWheelScrollView( itemExtent:150, children:<Widget>[ ... ], );复制children是子控件,itemExtent指定每一个Item的高度。当有大量数据的时候这种方式明显是不科学的,就像ListView.builder一样,用法如下:ListWheelScrollView.useDelegate( itemExtent:150, childDelegate:ListWheelChi

  • 如何优雅地关闭worker进程?

    之前我们讲解Nginx命令行的时候,可以看到Nginx停止有两种方式,分别是nginx-squit和nginx-sstop,其中stop是指立即停止Nginx,而quit是指优雅的关闭Nginx,对应的信号也是同样的,还有我们之前提到的reload和热升级这样的过程中都涉及到了优雅的停止Nginx。那所谓的优雅的停止Nginx究竟是怎样一个过程呢,接下来让我一起来学习下吧。何为优雅的关闭?所谓的优雅的关闭,是针对worker进程而言的,因为只有worker进程才会处理请求。如果我们在处理一个连接的时候,不管连接此时对于请求是怎样一个作用,直接去关闭链接会导致用户收到错误,所以优雅地关闭就是指Nginx的worker进程可以识别出当前连接没有正在处理请求,这个时候再把连接进行关闭。对于某些请求Nginx无法做到优雅地关闭worker进程,比如当Nginx代理websocket协议的时候,在websocket后面进行通讯的frame桢里面,Nginx是不解析他的桢的;Nginx做TCP层或者UDP层反向代理的时候,也没有办法识别一个请求需要经历多少报文才算是结束;但是对于HTTP请求,Ng

  • AJAX 与跨域通信(二):跨域解决方案

    本篇讲解常见的几种跨域方案:JSONP、CORS、图像Ping、document.domain、window.name。开始之前,要先清楚一件事:跨域不一定是浏览器限制了发起跨站请求,而也可能是跨站请求可以正常发起,但是返回结果被浏览器拦截了。最好的例子是CSRF跨站攻击原理,请求是发送到了后端服务器无论是否跨域!注意:有些浏览器不允许从HTTPS的域跨域访问HTTP,比如Chrome和Firefox,这些浏览器在请求还未发出的时候就会拦截请求,这是一个特例。1.JSONP<link>获取CSS,<script>获取JS,<img>获取图片,这些明明也是跨域获取资源,为什么不会被禁止呢?很简单,因为这些都不属于上述特定操作之一,这里请求资源压根没用到AJAX请求。再看看我们的需求,我们现在是要在A域中获取B域资源,那么我完全可以在A域中动态创建一个script并请求B域资源,然后,因为A域中的js和scirpt中的js是在同一个作用域中的,所以要在A域中展示B域的数据也完全不成问题。虽然说法比较简陋,但这就是JSONP的原理。下面我们来看看具体实现:

  • 团队开发中我都建议这样配置IDEA

    原文:http://985.so/aYzR 1.设置maven 1.在File->settings->搜索maven 2.Mavanhomedirectory--设置maven安装包的bin文件夹所在的位置 3.Usersettingsfile--设置setting文件所在的位置 4.Localrepository--设置本地仓库2.IDEA设置代码行宽度1.在File->settings->Editor->CodeStyle 2.有人会问,如果输入的代码超出宽度界线时,如何让IDE自动将代码换行?有两种方式! 3.第一种,在上述的“Rightmargin(columns)”的下方,有“Wrapwhentypingreachesrightmargin”选项,选中它,是什么效果呢? 4.随着输入的字符的增加,当代码宽度到达界线时,IDEA会自动将代码换行。 5.第一种方式是在输入代码时触发,还有第二种方式,在File->settings->CodeStyle->Java中,选中“WrappingandBraces”选项卡, 6.在“Keep

  • 响铃:深度分析拼多多的首场618战事:“猫拼狗“的快打旋风

    文|曾响铃 来源|科技向令说(xiangling0815)年年618,大众的热情不再那么高涨,时刻准备舆论战斗的媒体们也在例行公事中有些懈怠。但今年这场618有了新的“花样”。那个已经确定搅局成功的拼多多入场“搞事情”了。这是它的第一个618,来势难免汹汹。在以“折扣”为主题的618面前,原本就以低价打市场的拼多多变得更为“凶残”。升级“猫拼狗”后,“急眼”的618少了套路、多了真实天猫搞了双11,京东跟着搞了个618,大家原本各搞一摊其乐融融,在对方的节日里也适当投入意思意思——现成的电商狂欢节能用白不用。但今年618,以双11为主战场的天猫却莫名“激动”,早在5月27日天猫就高调宣布,今年618不仅在投入规模上要向双11看齐,“优惠力度”也要向双11看齐,要向消费者直接大量发放“无门槛红包”。“东道主”京东更是放言称要与合作伙伴一起“超过千万人”投入筹备工作之中,90%以上的核心品牌会在京东618上发布新品,“百万”线下门店将被联合起来参与618。看起来,大家都急眼了。原因何在?除了两个死对头之间对掐,首次闯入拼多多的粗暴和直接恐怕也是重要原因:某电吹风最低价仅售1888元,较官方

  • 【安富莱二代示波器教程】第16章 附件A---电阻屏触摸校准

    第16章     附件A---电阻屏触摸校准二代示波器的触摸校准比较简单,随时随地都可以做触摸校准,按下K1按键即可校准。有时候我们做触摸校准界面,需要在特定的界面才可以进入触摸校准状态,非常繁琐,这里采用的方法就非常省事了,也推荐大家在项目中使用。不管当前示波器打开的是哪个界面,都可以按下K1按键做触摸校准,实现方法如下:hTouchWin=WM_CreateWindowAsChild(0, 0, 800, 480, WM_HBKWIN, WM_CF_SHOW, _cbTouchCalibration, 0); WM_Exec(); WM_SelectWindow(hTouchWin); /*执行触摸校准*/ TOUCH_Calibration(); WM_SelectWindow(0); WM_DeleteWindow(hTouchWin); WM_Exec(); 复制============================关于这个触摸校准,有以下两点要注意:1、电阻屏四点触摸校准,校准后参数将保存到板载的EEPROM里面,下次上电会自动从

  • 灵感干涸?7条路径找到创新不老泉

    人们在听到“创新”一词时总会联想到研发中心、设计团队或者初创企业。但在今天,创新者无处不在,从工厂到销售展示厅,从IT客服中心到人事部门,从员工餐厅到高管层,所有岗位都在呼唤创新。创新并非某部门之责,而应是渗透进整个组织的思维方式。 不管采取哪种途径,创新都需要以“灵感”为原料,它是一种充满想象力的、对组织内部与外部机遇的洞察,帮助你提高效率、获取利润或者提高参与度。灵感可能关乎股东需求,或市场动态,甚至可能关乎你公司的运营机制。 不少《财富》500强企业单靠一个理念起家,其灵感来自对客户需求的见微知著。星巴克为咖啡店增添了几许意大利风情。家得宝(HomeDepot)给人们自己动手组装专业设备的机会。美体小铺(TheBodyShop)从成立伊始就反对残忍的动物测试,这种做法广受顾客支持。 灵感的力量无穷,但我们怎样才能发现它?是应该与同事做头脑风暴,还是通过筛查分析大量数据?是简单地进行反思,还是继续做份内的事,直到一个苹果砸到自己头上?虽然灵感的迸发对许多人来说纯属巧合,但是我们仍然相信,人们能够通过更系统的方式捕捉创新灵感,并总结出了下列7个“灵感路径”(insightcha

  • 写影评、看图写诗、甚至生成视频,微软亚洲研究院梅涛博士讲解视频理解的最新进展 | CCF-GAIR 2017

    AI科技评论按:7月7号,全球人工智能和机器人峰会在深圳如期举办,由CCF主办、雷锋网与中国香港中文大学(深圳)承办的这次大会共聚集了来自全球30多位AI领域科学家、近300家AI明星企业。AI科技评论最近将会陆续放出峰会上的精华内容,回馈给长期以来支持我们的读者们! 本次文章的演讲来自微软亚洲研究院资深研究员梅涛博士,分享主题为「视频内容的生命周期:创作,处理,消费」。 梅涛博士,微软亚洲研究院资深研究员,国际模式识别学会会士,美国计算机协会杰出科学家,中国科技大学和中山大学兼职教授博导。主要研究兴趣为多媒体分析、计算机视觉和机器学习,发表论文100余篇(h-index42),先后10次荣获最佳论文奖,拥有40余项美国和国际专利(18项授权),其研究成果十余次被成功转化到微软的产品和服务中。他的研究团队目前致力于视频和图像的深度理解、分析和应用。他同时担任IEEE和ACM多媒体汇刊(IEEETMM和ACMTOMM)以及模式识别(PatternRecognition)等学术期刊的编委,并且是多个国际多媒体会议(如ACMMultimedia,IEEEICME,IEEEMMSP等)的大会主

  • 多线程中的ManualResetEvent

    先来看一下简单的多线程控制台程序:using System; using System.Threading; namespace ManualResetEventStudy { class ThreadClass     { staticvoid t1()         { for (int x =1; x <=5; x++)             {                 Thread.Sleep(500);                 Console.WriteLine("t1的x:"+ x);             }         } staticvoid t2()         { for (int x =1; x <=5; x++)             {                 Thread.Sleep(500);                 Console.WriteLine("t2的x:"+ x);             }         } staticvoid 

  • 单因素和多因素cox回归分析

    前面我们讲过一个R函数搞定风险评估散点图,热图,其中LASSO模型的输入就是单因素cox分析得到的显著与生存相关的基因。今天我们就来探讨一下如何使用R来做单因素和多因素cox回归分析。 我们用R的survival包自带的一套肺癌的数据来举例 #安装下面两个R包 install.packages(c("survival","survminer")) #加载这两个R包 library("survival") library("survminer") #加载肺癌这套数据 data("lung") #显示前6行 head(lung)复制这里每一行是一个样本,从第三列开始每一列是一个特征 1.单因素cox回归分析 对单个特征进行cox回归分析,看它是否与样本的生存显著相关 #单因素cox回归分析,这里看性别sex这个特征 res.cox<-coxph(Surv(time,status)~sex,data=lung) res.cox复制可以看到这里算出来的p值是0.00149,是显著的 我

  • 腾讯云即时通信IM修改群基础资料群组管理

    功能说明App管理员可以通过该接口修改指定群组的基础信息。 接口调用说明适用的群组类型 群组类型ID 是否支持此RESTAPI Private 支持,同新版本中的Work(好友工作群) Public 支持 ChatRoom 支持,同新版本中的Meeting(临时会议群) AVChatRoom 支持 Community(社群) 支持 即时通信IM内置上述群组类型,详情介绍请参见群组系统。 请求URL示例https://console.tim.qq.com/v4/group_open_http_svc/modify_group_base_info?sdkappid=88888888&identifier=admin&usersig=xxx&random=99999999&contenttype=json复制 请求参数说明下表仅列出调用本接口时涉及修改的参数及其说明,更多参数详情请参考RESTAPI简介。 参数 说明 v4/group_open_http_svc/modify_group_base_info 请求接口

  • Nodejs + Express + MongoDB 基础篇(17 个视频)

    Nodejs+Express+MongoDB基础篇(17个视频) Node.js+Express+MongoDB基础篇#1介绍 Node.js+Express+MongoDB基础篇#2请求与响应 Node.js+Express+MongoDB基础篇#3路由参数 Node.js+Express+MongoDB基础篇#4查询字符串 Node.js+Express+MongoDB基础篇#5POST请求和Postman工具 Node.js+Express+MongoDB基础篇#6上传文件 Node.js+Express+MongoDB基础篇#7模板引擎介绍 Node.js+Express+MongoDB基础篇#8使用模板引擎 Node.js+Express+MongoDB基础篇#9中间件 Node.js+Express+MongoDB基础篇#10路由中间件 Node.js+Express+MongoDB基础篇#11项目实践part1项目搭建 Node.js+Express+MongoDB基础篇#12项目实践part2Controller Node.js+Express+MongoDB基础篇#1

  • MSSQL forensics (1) - MDF fundamentals

    LastyearIhadparticipatedin DigitalForensicsChallenge2019(DFC2019) andenjoyedalot. Theymadealotofexcitingquestions.Especially,IhadspentafairamountoftimestoworkonchallengesaroundMicrosoftSQLServer(MSSQL).DuringmychallengeItriedtofindusefultools/articlesforMSSQLforensics,butitseemsthatthereisnotmuchinformationontheInternet. That'swhyIwillwriteaserieswhatIhavelearnedaboutMSSQLfromaforensicperspective. Scope TherearealotofcomponentsofMSSQL.WhatIcandescribeattheseriesisasfollows: MDFfilestr

  • 解决微信sdk之uploadImage上传多张图片时循环提示“上传中”

     将isShowProgressTips设置为0,加上 isShowProgressTips:0 这个属性后,不再弹出“上传中”这个提示框modal了。 之后再自己配置个loading。

  • 约瑟夫环问题(猴子选大王)PHP版

    约瑟夫斯问题问题有时候也被描述成猴子选大王问题,题目如下。(最后会贴上约瑟夫问题的来历) 一群猴子排成一圈,按1,2,…,n依次编号。 然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。 要求编程模拟此过程,输入m、n,输出最后那个大王的编号。 用程序模拟该过程,代码如下: <?php functionmonkeyKing($n,$m) { $arr=range(1,$n);//构造一个数组 $i=1;//从第一个开始循环 while(count($arr)>1){//如果总数大于1 if($i%$m!=0){ $arr[]=$arr[$i-1];//不被踢出则压入数组尾部 } unset($arr[$i-1]);//压入数组然后删除 $i++;//继续循环 } return$arr[$i-1];//直至最后剩下一个为大王 } print_r(monkeyKing(5,3));//第4只为大王复制 $n=5 $m=3 $arr=[1,2,3,4,5] $

  • C++ map: stl source code.

    0引言 Map是C++stl中最重要且常用的数据结构之一,但是有时候在gdb中打印相关的数据时感觉有些困难。因此,感觉有必要研究一下这个问题。 file:stl_map.h,stl_tree.h       1datastructure class_Rb_tree{  };classmap{   typedef_Rb_tree<key_type,value_type,_Select1st<value_type>>,key_compare,_Pair_alloc_type>_Rep_type;   _Rep_type_M_t;///<theactualtreestructure.   size(){return_M_t.size();}///<stl_tree.h:size(){return_M_impl._M_node_count;}     }; 复制      2meaning   3.others

  • iOS面试题

    1、堆和栈什么区别?  答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak 2、数组和链表什么区别?  答:数组是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。       链表恰好相反,链表中的元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起。3、delegate和notification什么区别,什么情况使用? 答:Delegate:       消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,        delegate机制使得接收者可以改变发送者的行为。        通常发送者和接收者的关系

  • Token Based Authentication in Web API 2

    原文地址:http://www.c-sharpcorner.com/uploadfile/736ca4/token-based-authentication-in-web-api-2/ IntroductionThisarticleexplainstheOWINOAuth2.0AuthorizationandhowtoimplementanOAuth2.0AuthorizationserverusingtheOWINOAuthmiddleware.TheOAuth2.0AuthorizationframworkisdefinedinRFC6749.Itenablesthird-partyapplicationstoobtainlimitedaccesstoHTTPservices,eitheronbehalfofaresourceownerbyproducingadesiredeffectonapprovalinteractionbetweentheresourceownerandtheHTTPserviceorbyallowingthethird-partyapplicationto

  • MySQL列转行

    文章转自别人的博客 为了做备份(把别人的文章内容抄了一遍): #需要处理的表 createtabletbl_name(IDint,mSizevarchar(100)); insertintotbl_namevalues(1,'tiny,small,big'); insertintotbl_namevalues(2,'small,medium'); insertintotbl_namevalues(3,'tiny,big'); #用于循环的自增表 createtableincre_table(AutoIncreIDint); insertintoincre_tablevalues(1); insertintoincre_tablevalues(2); insertintoincre_tablevalues(3); 复制 selecta.ID,substring_index(substring_index(a.mSize,',',b.AutoIncreID),',',-1) from tbl_namea join incre_tableb onb.AutoIncreID<=(le

相关推荐

推荐阅读