您的位置 首页 > 德语词汇

append是什么意思 go语言的append函数没有你想的那么简单

大家好,今天来为大家分享append是什么意思的一些知识点,和go语言的append函数没有你想的那么简单的问题解析,大家要是都明白,那么可以忽略,如果不太清楚的话可以看看本篇文章,相信很大概率可以解决您的问题,接下来我们就一起来看看吧!

append是什么意思 go语言的append函数没有你想的那么简单

1、今天使用append函数时,遇到了一个小问题,所以深追了一下,和大家分享一下。

2、首先append是go语言内置的函数,作用就是为切片添加元素,常用操作如下:

3、s:=[]string{"a","b"}\ns=append(s,"c")\n

结果我们打印s就会是:a,b,c三个元素。但是大家思考一下下面的代码:

4、s:=[]string{"a","b","c"}\ns1:=append(s,"d")\nfmt.Println("s1:",s1)\nfmt.Println("ss:",s)\n

这时我们打印的s1与s分别是多少呢?当然这个也难不倒大家,结果分别是:abcd和abc。看到这里大家会想,append函数,会将传件来的s从原来的地方拷贝一份,然后再把"d"这个元素放进去,变成abcd再给到s1。当然目前看来可能是这样的。那么我们再看下面的代码:

5、s:=[]string{"a","b","c"}\ns1:=append(s[:2],"d")\nfmt.Println("s1:",s1)\nfmt.Println("ss:",s)\n

这时打印的结果应该是什么呢?首先我们分析一下,s[:2]这个操作,是截取了s中的前两个元素,也就是a和b。然后再把d添加进去,最后s1结果为:abd。这个是正确的。

6、那么打印的s是什么呢?按照前一个的逻辑,s应该还是原来的abc。但是结果并不是,真正的结果是:abd。这是为什么呢?

7、首先s的容量是3,当我们不截取的时候直接append,这是容量是不够的,所以要扩容到了6,扩容一倍。然后将d添加到扩容后的内存,所以这时s1的容量是6。当我们对s截取前两个元素后,那么s的容量仍然是3,但是元素只有前两个,所以在appen的时候,d元素把第三个位置占用了,然后再把新的给了s1,这时,s1容量也是3,值为abd。同时,由于这个d元素把之前的s的第三个位置占用了,所以s也就成了abd,也就是最后这个位置元素被覆盖了。

8、其实道理很简单,如果appen操作中的第一个参数,它的容量能够放下后面添加的元素的数量,那么第一个参数的值就会改变,因为没有扩容,如果它的容量不能够放下后面添加的元素,那么就会扩容,将后面的元素再添加到新扩容的位置,这时第一个元素也就是s并不会改变,只是把扩容后的给了新的s1。

9、今天说这个是希望大家以后遇到了要知道这是为什么,因为有时我们做append操作上面两种情况都有可能遇到的,尤其是第二种情况,大家一定要知道,这个s也会改变的。

10、后续会有更多的模式和算法以及区块链相关的,如果你是想学习go语言或者是对设计模式或者算法感兴趣亦或是区块链开发工作者,都可以关注一下。(微信公众号:Go语言之美,更多go语言知识信息等)。公众号会持续为大家分享更多干货。

好了,本文到此结束,如果可以帮助到大家,还望关注本站哦!

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023