輕風解語 發表於 2019-12-20 20:20:00

Go 字符串 (string)

<p>字符串类型为 <code>string</code>,使用双引号或者反引号包起来</p>
<h2 id="字符串形式">字符串形式</h2>
<h3 id="反引号">反引号</h3>
<p>当使用反引号时不会对字符串进行转义,并可以包含多行文本</p>
<p>示例:</p>
<pre><code class="language-golang">package main

import "fmt"

func main() {
        a := `
hello
world
!
        `
        b := `hello \n world`
        fmt.Println(a)
        fmt.Println(b)
}

</code></pre>
<p>输出结果:</p>
<pre><code class="language-text">
hello
world
!
      
hello \n world

</code></pre>
<h3 id="双引号">双引号</h3>
<p>当使用双引号时,只能通过 <code>\n</code> 进行换行<br>
示例:</p>
<pre><code class="language-golang">package main

import "fmt"

func main() {
        a := "hello \n world"
        fmt.Println(a)
}

</code></pre>
<p>输出结果:</p>
<pre><code class="language-text">hello
world

</code></pre>
<h2 id="切片">切片</h2>
<h3 id="一个字节">一个字节</h3>
<p>如果直接使用索引进行取值,会取到一个字节<br>
示例:</p>
<pre><code class="language-golang">package main

import (
        "fmt"
)

func main() {
        a := "abc"
        for i := 0; i &lt; len(a); i++ {
                fmt.Printf("%v, %T\n", a, a)
        }
}
</code></pre>
<p>输出结果:</p>
<pre><code class="language-text">97, uint8
98, uint8
99, uint8
</code></pre>
<h3 id="多个字节">多个字节</h3>
<p>如果通过切片取出来的还是字符串,即使只取了一个字节也是一个字节的字符串<br>
示例:</p>
<pre><code class="language-golang">package main

import (
        "fmt"
)

func main() {
        a := "abc"
        for i := 0; i &lt; len(a); i++ {
                fmt.Printf("%v, %T\n", a, a)
        }
}
</code></pre>
<p>输出结果:</p>
<pre><code class="language-text">a, string
b, string
c, string
</code></pre>
<h2 id="不可修改">不可修改</h2>
<p>Go 中字符串类型是不能修改的,多个字符串低层都可以共用一段内存,这使得复制字符串、生成子串的成本都非常低</p>
<h3 id="修改">修改</h3>
<p>有两种方式可以改变字符串值:</p>
<h4 id="1-重新赋值">1. 重新赋值</h4>
<p>新开辟一段内存存放新的字符串</p>
<pre><code class="language-golang">func main() {
        a := "hello world"
        fmt.Println(a)
        a := "Hello world"
        fmt.Println(a)
}
</code></pre>
<h4 id="2-先转换为切片修改之后再改回来">2. 先转换为切片,修改之后再改回来</h4>
<p><strong>注意:如果要修改像中文字符之类超过 3 个字节的字符,需要转换为 <code>rune</code> 而不是 <code>byte</code></strong><br>
关于 rune 和 byte &lt;- 点击查看<br>
示例:</p>
<pre><code class="language-golang">func main() {
        a := "hello world"
        b := []rune(a)
        b = 'H'
        a = string(b)
        fmt.Printf("%v", a)
}
</code></pre>
<h2 id="遍历">遍历</h2>
<p>由于 <code>len(string)</code> 获得的是字符串的字节数,所以直接通过长度遍历遍历的是字节数,超过 1 字节的字符无法正常遍历<br>
示例:</p>
<pre><code class="language-golang">func main() {
        a := "你好 world"
        for i := 0; i &lt; len(a); i ++ {
                fmt.Printf("%c - %T\n",a,a)
        }
}
</code></pre>
<p>遍历的是每个字节</p>
<h3 id="for-range">for range</h3>
<p>通过 <code>for range</code> 遍历可以正常地显示每个字符<br>
示例:</p>
<pre><code class="language-golang">func typeString() {
        for _, v := range a {
                a := "你好 world"
                fmt.Printf("%c - %T\n",v,v)
        }
}
</code></pre>
<p>遍历的是每个字符</p><br><br>
来源:https://www.cnblogs.com/dbf-/p/12074898.html
頁: [1]
查看完整版本: Go 字符串 (string)