上节中,我们讲到了go语言中append函数的使用,有疑问的同学可以去主页翻看一下,这里我们不做赘述。

下面我们较为深入地了解一下go中的这个append函数。

①首先我们来定义一个切片iArray1,并打印它的值来看一下。

我们可以看到,就是平平无奇的两行代码,定义变量和打印输出。哈哈哈

② 然后,我们来定义切片iArray2,并且内存指向切片iArray1,接下来我们对切片iArray2进行移除元素,然后将两个切片都打印出来看看。

从图中,我们可以看出,两个切片中的元素“2"都被移除了,切片iArray2中,移除了元素没错,但是我们仔细看切片iArray1,发现虽然移除了一个元素,但是元素总个数却没有减少,这是为什么呢?其实,go语言中通过append移除元素,其实是将前后两个部分重新连接起来,实质上就是将删除点之后的元素前移,将内存重新连接起来

我们仔细分析一下:

仔细看下图,其实在最开始的时候,切片iArray1和iArray2指向的是同一块内存地址。

然后我们用append函数来操作了这块内存地址上的值,我们发现值不一样了,所以我们这时候来打印一下内存地址看看。

看到这里,肯定很多人和当初的我一样,这是怎么回事呢,指向的是同一块内存地址,但为什么打印出来的值不一样呢?这时,我们再打印两个切片的长度试试。

原来只是在append执行后, 其实是对整个内存地址中的元素进行操作了,但是呢,切片iArray2的长度只有6个,所以只能看到前六个元素,并不是重新给它分配了一块内存。

下面,画一个丑丑的图来总结一下:

(1)刚开始的时候,切片irray1和iarray2初始长度都是7,且都指向0xc00000a240这块内存地址。

(2)append对内存0xc00000a240上的值进行操作:append干掉元素“2”后,其后的元素前移,所以元素“2,3,4,5”元素的位置由“3,4,5,6”代替,但是元素“6”的位置没有元素来代替它,保留原值。所以append操作完后内存0xc00000a240存的值就变为了“0,1,3,4,5,6,6”。

(3)append执行完后,切片irray1和iarray2指向的仍然都是0xc00000a240这块内存地址。

(4)由于append返回值赋值到了切片iarray2,所以切片iarray2的长度就变为了6。所以打印出来就是[0 1 3 4 5 6],但是irray1的长度还是最开始的7,所以打印出来就是[0 1 3 4 5 6 6]。

Golang 入门:详谈append函数相关推荐

  1. Golang append函数的基本原理

    append 函数 func append(slice []Type, elems ...Type) []Type 将元素添加至切片中,如果超出了容量,将会返回一个容量二倍与当前切片的切片 本身我们看 ...

  2. Golang append函数对于空类型的处理

    对于向map,slice这样的类型,如果不对它们进行初始化,它们的零值为nil.在我之前的概念里,对于初始值为nil的变量,如果要对齐进行操作,一定要先进行初始化,如调用make或者new函数. 但是 ...

  3. Golang入门(2):一天学完GO的基本语法

    摘要 在配置好环境之后,要研究的就是这个语言的语法了.在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆.因为这篇文章只是入门Golang的第二 ...

  4. Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...

  5. Golang入门(4):并发

    Golang入门(4):并发 摘要 并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要.Web服务器会一次处理成千上万的请求,这也是并发的必要性之一.Golang的并发控制比起J ...

  6. golang开发工程师-第一步:golang入门基础教学

    golang入门基础教学 前言 一.golang的优势何在? 二.goland破解教程 三.goland的使用教程 四.一个简单的go代码 五.变量的声明和赋值 六.数据类型的基本介绍 七.访问权限[ ...

  7. 洛谷刷题记录(python)【入门6】函数与结构体

    [入门6]函数与结构体https://www.luogu.com.cn/training/105#problems P5735 [深基7.例1]距离函数 import mathdef solve(a, ...

  8. python中append函数解析_对python中的pop函数和append函数详解

    对python中的pop函数和append函数详解 pop()函数 1.描述 pop() 函数用于移除列表中的一个元素(默认最后一个元素),并且返回该元素的值. 语法 pop()方法语法: list. ...

  9. 算法入门四:函数与函数体:

    文章目录 算法入门四:函数与函数体: 引言: 函数与函数体: 章节介绍: 1.洛谷 p5735 Java 距离函数 2.洛谷 p5737 Java 闰年展示 3.洛谷 p5739 Java 计算阶乘 ...

最新文章

  1. 引入antd组件样式_如何使用 dumi 和 fatherbuild 创建组件库
  2. 告诉SEO初学者:百度收录并非终极目标
  3. Nginx重要结构request_t解析之http请求的获取
  4. 《程序员》杂志2011年第5期.pdf 下载链接 首发。
  5. 《vSphere性能设计:性能密集场景下CPU、内存、存储及网络的最佳设计实践》一1.2.2 内存...
  6. 包容网关 Inclusive Gateway
  7. excel首行空不能导入access_终于解决SQL Server 2008 64位系统无法导入Access/Excel的问题 2012/08/01...
  8. 微信测试公众号-jssdk基本配置和使用-thinkphp
  9. java语句电脑定时关机_月光软件站 - 编程文档 - Java - windows定时关机程序
  10. 计算机史话 —— 回车和换行 与 文本文件和二进制文件
  11. Java并发AtomicIntegerArray类
  12. Linux系统的头文件和库文件搜索路径
  13. 1.4-shell中特殊符号
  14. Collecting package metadata (current_repodata.json): failed(解决方案)
  15. android多媒体框架介绍(一)整体架构
  16. 红与黑 DFS(JAVA解法)
  17. C - Quick Sort (one of the simplest)
  18. yolov4-tiny使用jetson nano进行目标检测+tensorrt+CSI+USB摄像头检测
  19. 网页添加飘动窗口(图片链接)+ IE8下js解析错误
  20. 微信小程序 text 标签小技巧

热门文章

  1. 免费快递API接口有哪些要求(附快递鸟规范说明)
  2. 五种思维方式助力商人成功
  3. Symantec AntiVirus 9.0 Corporate Edition Client 病毒库更新下载
  4. java的3大注释快捷键大全
  5. 吴恩达机器学习之引言:入门、机器学习是什么、监督学习、无监督学习、推荐Octave软件进行开发
  6. 大数据与银行风险管理革命
  7. Spark 原理详解 整理
  8. 用 Python 画一张北京实时疫情地图:从爬虫到绘图到自动上传服务器
  9. SQL Server 2016 列存储索引功能增强
  10. Unity中使用暴风魔镜蓝牙手柄