教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 golang中slice的扩容原理

golang中slice的扩容原理

发布时间:2022-01-07   编辑:jiaochengji.com
教程集为您提供golang中slice的扩容原理等资源,欢迎您收藏本站,我们将为您提供最新的golang中slice的扩容原理资源
<svg xmlns="http://www.w3.org/2000/svg" style="display: none;"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"/></svg><h1>golang中slice的扩容</h1> <h3>前言</h3>

学习golang肯定使用过slice(切片),大家都知道它是一种数据结构,这种数据结构便于使用和管理数据集合,并且他是围绕动态数组的概念构建的,可以按照自己的需求自动缩小或者扩容,但是在学习这个知识点的时候我并没有深究其扩容的底层原理,故对此写下这篇博客进行记录,方便我的学习以及后期的复盘

<h3>
简介</h3>

切片的动态增长是通过内置函数append来实现的,这个函数可以快速高效的增长切片,还可以通过对切片再次切片来缩小一个切片的大小。切片是一个非常小的对象,它是对底层的数组进行了抽象,并且提供了相关的操作方法。他拥有三个字段,分别为:指向底层数组的指针,长度,容量。

<h3>
内部的实现</h3>

<h3>
切片的增长</h3>

相对于数组而言,使用切片的其中一个好处就是,切片可以按照自己的需求进行扩容,其中主要依赖的appen函数,他会处理增加长度的所有操作细节。

<blockquote>

append有两个参数,第一个是需要一个被操作的切片,第二个是你要追加的值。对于append追加值有两种情况,第一种就是扩容的范围在容量内,第二个是大小超过容量的大小,

</blockquote>

下面这段代码为第一种情况:

<pre><code class="lang-go hljs"><span class="token comment">//创建一个整型切片</span> <span class="token comment">//长度和容量都为5</span> slice <span class="token operator">:=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token builtin">int</span><span class="token punctuation">{</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">20</span><span class="token punctuation">,</span><span class="token number">30</span><span class="token punctuation">,</span><span class="token number">40</span><span class="token punctuation">,</span><span class="token number">50</span><span class="token punctuation">}</span> <span class="token comment">//创建一个新的切片</span> <span class="token comment">//长度为两个元素,容量为四个元素</span> newSlice <span class="token operator">:=</span>slice<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">:</span><span class="token number">3</span><span class="token punctuation">]</span> <span class="token comment">//使用原有的容量来分配一个新的元素</span> <span class="token comment">//将新的元素赋值为60</span> newSlice <span class="token operator">=</span> <span class="token function">append</span><span class="token punctuation">(</span>newSlice<span class="token punctuation">,</span><span class="token number">60</span><span class="token punctuation">)</span> </code></pre>

上述代码中的append操作完以后,两个切片和底层的布局如图:

因为newSlice在底层数组里面还有额外的容量可用,append操作会将可用的元素合并到切片的长度中,并对其进行赋值。由于和原始的slice共享同一个底层数组,slice中索引为3的元素值也被改动了。如果底层的数组容量不够时,append函数会创建一个新的底层数组,将被引用的现有的值赋值进新的数组中,再追加新的值,如下代码:

<pre><code class="lang-go hljs"><span class="token comment">//创建一个整型切片</span> <span class="token comment">//其长度和容量都是4个元素</span> slice <span class="token operator">:=</span><span class="token builtin">int</span><span class="token punctuation">{</span><span class="token number">10</span><span class="token punctuation">,</span><span class="token number">20</span><span class="token punctuation">,</span><span class="token number">30</span><span class="token punctuation">,</span><span class="token number">40</span><span class="token punctuation">}</span> <span class="token comment">//向切片追加一个新的元素</span> <span class="token comment">//将新元素设置为50</span> NewSlice <span class="token operator">:=</span><span class="token function">append</span><span class="token punctuation">(</span>slice<span class="token punctuation">,</span><span class="token number">50</span><span class="token punctuation">)</span> </code></pre> <h3>
总结</h3>

在golang中使用append来给slice扩容会出现两种情况,第一种是slice的容量足够时,会将新值直接插入到slice的底层数组中;第二种是slice的容量不够时,append操作会将slice的地址指针指向一个新的底层数组,将原来数组的数据赋值进新的数组中,再将新值插入,并且新的数组的容量为原来的两倍

到此这篇关于“golang中slice的扩容原理”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
Golang语言slice实现原理及使用方法
[go语言]-slice实现的使用和基本原理
Golang 切片(slice)扩容机制源码剖析
Golang 深入 slice 实现原理及使用技巧
golang slice 最后一个元素_Go 常见的数据结构 Slice
golang中slice的扩容原理
Golang Slice
Golang slice 切片原理
Golang make多种使用方法详解
golang key map 所有_Golang面试知识点总结

[关闭]
~ ~