Golang 入门:详谈append函数

上节中,我们讲到了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]。

猜你喜欢

转载自blog.csdn.net/weixin_45963929/article/details/125874039