<?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>String on 维克的博客</title><link>https://blogs.wuvikr.top/tags/string/</link><description>Recent content in String on 维克的博客</description><generator>Hugo</generator><language>en</language><lastBuildDate>Fri, 25 Sep 2026 10:01:44 +0800</lastBuildDate><atom:link href="https://blogs.wuvikr.top/tags/string/index.xml" rel="self" type="application/rss+xml"/><item><title>Go 语言中的字符串类型</title><link>https://blogs.wuvikr.top/posts/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%B1%BB%E5%9E%8B/</link><pubDate>Fri, 25 Sep 2026 10:01:44 +0800</pubDate><guid>https://blogs.wuvikr.top/posts/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%B1%BB%E5%9E%8B/</guid><description>&lt;p>Go 原生支持字符串类型，关键字&lt;code>string&lt;/code>用于表示字符串数据类型。&lt;/p>
&lt;h1 id="1-底层实现">1. 底层实现&lt;/h1>
&lt;p>Go 中的&lt;code>string&lt;/code>实际上是一个&lt;code>struct&lt;/code>类型，其本身并不真正存储字符串数据，仅是由一个指向底层数组的指针和字符串的长度字段组成，可以在标准库的&lt;code>reflect&lt;/code>包中，找到下面代码：&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">// $GOROOT/src/reflect/value.go&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">// StringHeader是一个string的运行时表示&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#66d9ef">type&lt;/span> &lt;span style="color:#a6e22e">StringHeader&lt;/span> &lt;span style="color:#66d9ef">struct&lt;/span> {
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Data&lt;/span> &lt;span style="color:#66d9ef">uintptr&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span> &lt;span style="color:#a6e22e">Len&lt;/span> &lt;span style="color:#66d9ef">int&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>}
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>由于&lt;code>string&lt;/code>类型实际上只是一个对底层存储的引用，因此实际传参的开销非常小，另外在生成&lt;code>string&lt;/code>变量时，会同时存储字节长度&lt;code>len&lt;/code>，所以无论字符串长度怎么变化，获取长度的时间都是&lt;code>O(1)&lt;/code>。&lt;/p>
&lt;p>&lt;strong>底层实现图解&lt;/strong>：&lt;/p>
&lt;p>&lt;img alt="string的底层实现" loading="lazy" src="https://blogs.wuvikr.top/posts/go%E8%AF%AD%E8%A8%80%E4%B8%AD%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2%E7%B1%BB%E5%9E%8B/string%E7%9A%84%E5%BA%95%E5%B1%82%E5%AE%9E%E7%8E%B0.png">&lt;/p>
&lt;p>&lt;strong>三个必须记住的特性&lt;/strong>：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>特性&lt;/th>
&lt;th>含义&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>不可变&lt;/td>
&lt;td>任何“修改”操作都会产生新字符串，原串不变&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>UTF-8 编码&lt;/td>
&lt;td>源码中的字符串字面量默认是 UTF-8&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>零值是 &lt;code>&amp;quot;&amp;quot;&lt;/code>&lt;/td>
&lt;td>不是 nil，&lt;code>var s string&lt;/code> 是空串&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&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:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">s&lt;/span> &lt;span style="color:#66d9ef">string&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;Hello&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// s[0] = &amp;#39;h&amp;#39; // 编译错误：cannot assign to s[0]&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">b&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> []byte(&lt;span style="color:#a6e22e">s&lt;/span>) &lt;span style="color:#75715e">// 想修改就转成切片（会复制一份）&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>
&lt;blockquote>
&lt;p>注意：&lt;code>len(s)&lt;/code>返回的是字节数，不是字符数。中文、emoji 等多字节字符会让两者不相等。&lt;/p>
&lt;/blockquote>
&lt;h1 id="2-字面量与引号">2. 字面量与引号&lt;/h1>
&lt;p>Go 中初始化字符串变量，需要在双引号&lt;code>&amp;quot;&lt;/code>中定义值，单引号&lt;code>'&lt;/code>用于单个字符（ 以及 runes ）。&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:#66d9ef">var&lt;/span> &lt;span style="color:#a6e22e">Name&lt;/span> &lt;span style="color:#66d9ef">string&lt;/span> = &lt;span style="color:#e6db74">&amp;#34;zhangsan&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#a6e22e">age&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;18&amp;#34;&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:#a6e22e">char&lt;/span> = &lt;span style="color:#e6db74">&amp;#39;a&amp;#39;&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:#a6e22e">s1&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;hello\nworld&amp;#34;&lt;/span> &lt;span style="color:#75715e">// 双引号：支持 \n \t \&amp;#34; \\ 等转义&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 输出：&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// hello&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// world&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:#a6e22e">s2&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> &lt;span style="color:#e6db74">`hello\nworld`&lt;/span> &lt;span style="color:#75715e">// 反引号（原生字符串）：原样保留&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// 输出：&lt;/span>
&lt;/span>&lt;/span>&lt;span style="display:flex;">&lt;span>&lt;span style="color:#75715e">// hello\nworld&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:#a6e22e">s3&lt;/span> &lt;span style="color:#f92672">:=&lt;/span> &lt;span style="color:#e6db74">&amp;#34;&amp;#34;&lt;/span> &lt;span style="color:#75715e">// 空串，len == 0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Go 中没有也不支持三引号的写法，使用反引号来表示原生字面量。由于所见即所得，原样保留，可跨行的特点，常用于&lt;code>SQL/JSON/正则表达式&lt;/code>中&lt;/p></description></item></channel></rss>