<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Slice on 维克的博客</title><link>https://blogs.wuvikr.top/tags/slice/</link><description>Recent content in Slice on 维克的博客</description><generator>Hugo</generator><language>en</language><lastBuildDate>Wed, 30 Sep 2026 15:55:22 +0800</lastBuildDate><atom:link href="https://blogs.wuvikr.top/tags/slice/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 语言中的 Slice 类型</title><link>https://blogs.wuvikr.top/posts/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84slice%E7%B1%BB%E5%9E%8B/</link><pubDate>Wed, 30 Sep 2026 15:55:22 +0800</pubDate><guid>https://blogs.wuvikr.top/posts/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84slice%E7%B1%BB%E5%9E%8B/</guid><description>&lt;p>Slice（切片）是 Go 语言内置的&lt;strong>可变长度序列&lt;/strong>，属于引用类型，基于底层数组封装实现，&lt;strong>解决数组长度固定、数组传参完整拷贝开销大的问题&lt;/strong>，是 Go 开发最常用的数据结构之一。&lt;/p>
&lt;h1 id="1-slice-的基础特性">1. Slice 的基础特性&lt;/h1>
&lt;ul>
&lt;li>&lt;strong>可变长度&lt;/strong>：长度不固定，可通过 &lt;code>append&lt;/code> 动态追加元素。&lt;/li>
&lt;li>&lt;strong>底层数组共享&lt;/strong>：切片本身不存储实际元素，元素存放在底层数组；多个切片可以指向同一个底层数组，修改会互相影响。&lt;/li>
&lt;li>&lt;strong>len 与 cap 分离&lt;/strong>：&lt;code>len&lt;/code>代表切片当前可用元素个数；&lt;code>cap&lt;/code>代表底层数组允许的最大容量。&lt;/li>
&lt;li>&lt;strong>零值特性&lt;/strong>：切片零值为 &lt;code>nil&lt;/code>，&lt;code>nil slice&lt;/code> len=0、cap=0；&lt;code>nil slice&lt;/code> 和空切片 &lt;code>[]int{}&lt;/code> 不相等。&lt;/li>
&lt;li>&lt;strong>引用语义&lt;/strong>：切片变量存储的是结构体头信息，赋值、传参拷贝的是切片头，不是底层数组。&lt;/li>
&lt;li>&lt;strong>不可直接比较&lt;/strong>：切片不能使用 &lt;code>==&lt;/code> 判断两个切片内容是否相等，仅允许和 &lt;code>nil&lt;/code> 做相等判断。&lt;/li>
&lt;/ul>
&lt;div class="alert alert-tip" role="alert">
&lt;p class="alert-title">友情提示&lt;/p>
&lt;p>上述特性与 Slice 的底层实现紧密关联，建议结合第 4 节&amp;quot;Slice 底层实现原理&amp;quot;章节阅读，以获得更深入的理解。&lt;/p>
&lt;/div>
&lt;h1 id="2-slice-的四种初始化方式">2. Slice 的四种初始化方式&lt;/h1>
&lt;p>切片必须初始化，&lt;code>nil&lt;/code>切片可以读取、append，但不能直接对索引位置赋值。&lt;/p>
&lt;h2 id="21-声明未初始化nil-slice">2.1 声明未初始化（nil slice）&lt;/h2>
&lt;p>仅定义变量，底层数组指针为 nil，len=0、cap=0。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;">&lt;code class="language-go" data-lang="go">&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 声明nil切片，未分配底层数组&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">a&lt;/span> []&lt;span style="color:#66d9ef">string&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">fmt&lt;/span>.&lt;span style="color:#a6e22e">Println&lt;/span>(&lt;span style="color:#a6e22e">a&lt;/span> &lt;span style="color:#f92672">==&lt;/span> &lt;span style="color:#66d9ef">nil&lt;/span>) &lt;span style="color:#75715e">// true&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">fmt&lt;/span>.&lt;span style="color:#a6e22e">Println&lt;/span>(len(&lt;span style="color:#a6e22e">a&lt;/span>), cap(&lt;span style="color:#a6e22e">a&lt;/span>)) &lt;span style="color:#75715e">// 0 0&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// a[0] = &amp;#34;hello&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 未初始化的切片直接赋值会引发 panic&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// panic: index out of range&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;h2 id="22-字面量初始化空切片带初始值">2.2 字面量初始化（空切片/带初始值）&lt;/h2>
&lt;p>直接初始化，分配底层数组，支持空切片和预设元素。&lt;/p></description></item></channel></rss>