V
Vel·ToolKit
简洁 · 高效 · 即开即用
ZH
第 8 章 / 共 20 章

字符串

字符串本质、rune、strings 包

字符串是不可变的字节序列

string 底层是只读的 UTF-8 字节数组。索引 s[i] 拿到的是 byte(uint8),不是字符。

package main

import "fmt"

func main() {
    s := "你好"
    fmt.Println(len(s)) // 6(UTF-8 字节数)
    fmt.Println(s[0])   // 228(第一个字节)
}

rune 与遍历字符

rune 是 int32 别名,表示一个 Unicode 码点。range 遍历会自动按 UTF-8 解码。

package main

import "fmt"

func main() {
    for i, r := range "你好" {
        fmt.Printf("%d %c %U\n", i, r, r)
    }
    // 输出:
    // 0 你 U+4F60
    // 3 好 U+597D
}

拼接性能

+ 拼接每次产生新字符串。大量拼接请用 strings.Builder。

package main

import (
    "fmt"
    "strings"
)

func main() {
    var b strings.Builder
    for i := 0; i < 1000; i++ {
        b.WriteString("x")
    }
    s := b.String()
    fmt.Println(len(s))
}

常用 strings 包函数

  • strings.Contains / HasPrefix / HasSuffix
  • strings.Split / Join
  • strings.ReplaceAll / TrimSpace / ToLower
  • strconv.Itoa / Atoi 数字 ⇄ 字符串