上节中,我们讲到了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. linux redis数据库安装配置,Linux系统中redis的安装配置步骤
  2. JVM垃圾回收机制总结(5) :JDK垃圾收集器的配置命令
  3. View(视图)——ListView概述、Adapter分类
  4. 2021云栖大会丨首批阿里云计算巢认证合作伙伴获得授牌,阿里云与合作伙伴共筑云上生态
  5. python视频网站项目_Python开发教育网站项目实例教学(105集视频课程含源码)
  6. h5海报设计开源工具_5个用于教幼儿阅读的开源工具
  7. TensorFlow2.0:索引和切片(2)
  8. 20款免费响应式的 HTML5 网站模板下载
  9. Mac升级emacs26
  10. 纯css3代码写九宫格效果
  11. 基于深度学习的单目图像深度估计
  12. 假设检验_关于假设检验与P值的几点看法
  13. python曲线镜像_在Python中以对角方式镜像图像
  14. python编程作业
  15. Linux sleep exit abort函数
  16. Rework 读后感
  17. matlab shading颜色设置,关于matlab中pcolor显示图片时的shading设置问题
  18. 身份证上男女识别--非线性问题02
  19. 实时音视频聊天中的延时问题一篇就够,低延时场景及优化
  20. Android 使用Arcore 实现多点测距

热门文章

  1. [紧急求助] LM317可调式直流稳压源输出电压不稳
  2. 问 0x7FFFFFFF+0x7FFFFFFF 是多少
  3. Get新技能:用C语言代码打开网页
  4. 浅谈频率学派和贝叶斯学派
  5. 这些很好用的小众 app真的很有趣!
  6. Linux 基础 | 命令行的艺术(交互式 Bash)
  7. TensorFlow搭建双向LSTM实现时间序列预测(负荷预测)
  8. 小米平板8.0系统怎么样无root激活Xposed框架的步骤
  9. 智能手机10大未来发展趋势
  10. 连接上无线网信号没有网络连接到服务器,无线网络连接上但上不了网怎么办? | 192路由网...