ZetCode

Golang 字符串类型

最后修改时间 2025 年 5 月 8 日

本教程将详细探讨 Go 内置的 string 类型,并提供全面的使用指南。通过实际示例,我们将涵盖基本概念、常见操作和最佳实践,帮助您在 Go 中高效地操作和处理字符串数据。

在 Go 中,string 类型表示一个不可变的字节序列,非常适合存储和操作文本数据,包括 Unicode 字符。字符串可以通过两种主要方式定义:使用双引号 ("...") 定义解释型字符串,其中可以识别转义序列,如 \n(换行符);或者使用反引号 (`...`) 定义原始字符串,它保留精确的格式和特殊字符,不受转义规则的限制。字符串的不可变性意味着任何修改都会创建一个新字符串,而不是改变现有字符串。

默认情况下,Go 字符串采用 UTF-8 编码,这确保了高效处理国际字符以及与现代文本处理应用程序的兼容性。它们支持索引、切片和连接等基本操作,使开发人员能够提取子字符串或构建动态文本结构。

此外,Go 在 strings 包中提供了丰富的内置函数,支持高级文本操作任务,如大小写转换、修剪、搜索和拆分。理解这些功能对于编写高效且可维护的 Go 程序至关重要。

基本字符串操作

此示例演示了基本的字符串操作,包括连接、长度和索引。Go 中的字符串像数组一样是零索引的。

注意:字符串索引指向字节,不一定指向字符。
basic_string.go
package main

import "fmt"

func main() {

    s1 := "Hello"
    s2 := "世界" // "World" in Chinese
    
    // Concatenation
    greeting := s1 + " " + s2
    fmt.Println(greeting)
    
    // Length in bytes
    fmt.Println("Length of s1:", len(s1))
    fmt.Println("Length of s2:", len(s2))
    
    // Accessing characters
    fmt.Println("First character of s1:", string(s1[0]))
    fmt.Println("First byte of s2:", s2[0])
}

示例展示了使用 + 进行字符串连接,使用 len 获取长度,以及使用索引进行 byte 访问。请注意,len 返回的是字节数,而不是 rune 的数量。

Go 中的字符串迭代

在 Go 中,字符串的迭代方式取决于您是需要处理单个字节还是完整的 Unicode 字符(rune)。理解这些方法对于高效处理文本至关重要,尤其是在处理多语言数据或特殊字符时。

string_iteration.go
package main

import "fmt"

func main() {

    s := "Hello 世界"
    
    fmt.Println("Byte iteration:")
    for i := 0; i < len(s); i++ {
        fmt.Printf("%x ", s[i])
    }
    fmt.Println()
    
    fmt.Println("Rune iteration:")
    for index, runeValue := range s {
        fmt.Printf("%#U starts at byte position %d\n", runeValue, index)
    }
}

使用带索引的 for 循环可以逐字节地迭代字符串,这对于底层操作很有用,但可能会分割多字节字符。由于 Go 字符串使用 UTF-8 编码,“世界”等非 ASCII 字符由多个字节表示。因此,仅迭代字节在处理 Unicode 文本时可能产生不完整或意外的结果。

另一方面,使用 range 关键字进行迭代会自动解码 UTF-8 rune,确保每个 Unicode 字符都被正确地视为一个单元。在处理文本时,通常首选此方法,因为它尊重字符边界,并防止多字节字符被意外分割。

字符串操作

strings 包提供了许多有用的字符串操作函数。此示例展示了常见的操作,如修剪、拆分和替换。

string_manipulation.go
package main

import (
    "fmt"
    "strings"
)

func main() {

    s := "   Hello, World!   "
    
    // Trimming whitespace
    trimmed := strings.TrimSpace(s)
    fmt.Printf("Trimmed: '%s'\n", trimmed)
    
    // Splitting
    parts := strings.Split(trimmed, ",")
    fmt.Println("Split parts:", parts)
    
    // Replacement
    replaced := strings.Replace(trimmed, "World", "Gopher", 1)
    fmt.Println("Replaced:", replaced)
    
    // Case conversion
    fmt.Println("Upper:", strings.ToUpper(trimmed))
    fmt.Println("Lower:", strings.ToLower(trimmed))
}

strings 包对于 Go 中的字符串处理至关重要。它提供了高效搜索、修改和分析字符串的函数。

字符串转换

字符串经常需要转换为/从其他类型,如字节切片或 rune 切片。此示例演示了常见的转换。

string_conversion.go
package main

import (
    "fmt"
    "strconv"
)

func main() {

    // String to byte slice
    s := "Hello"
    byteSlice := []byte(s)
    fmt.Println("Byte slice:", byteSlice)
    
    // Byte slice to string
    newStr := string(byteSlice)
    fmt.Println("Back to string:", newStr)
    
    // String to rune slice
    runeSlice := []rune("世界")
    fmt.Println("Rune slice:", runeSlice)
    
    // Number to string
    numStr := strconv.Itoa(42)
    fmt.Println("Number as string:", numStr)
    
    // String to number
    num, _ := strconv.Atoi("42")
    fmt.Println("String as number:", num)
}

字符串与字节/rune 切片之间的转换对于处理非常常见。strconv 包处理数值转换,并提供额外的控制。

字符串格式化

Go 的 fmt 包提供了强大的字符串格式化功能。此示例展示了常见的格式化动词及其用法。

string_formatting.go
package main

import "fmt"

func main() {

    name := "Alice"
    age := 30
    height := 5.7
    
    // Basic formatting
    fmt.Printf("Name: %s, Age: %d\n", name, age)
    
    // Floating point precision
    fmt.Printf("Height: %.1f feet\n", height)
    
    // Padding and alignment
    fmt.Printf("|%10s|%5d|\n", name, age)
    fmt.Printf("|%-10s|%-5d|\n", name, age)
    
    // String building with Sprintf
    info := fmt.Sprintf("%s is %d years old", name, age)
    fmt.Println("Constructed string:", info)
}

fmt 包的格式化动词提供了对字符串输出的精确控制。Sprintf 用于构建字符串而不打印它们,这对于字符串构建非常有用。

来源

Go 语言规范

本教程通过实际的常见字符串操作和处理示例,介绍了 Go 中的字符串类型。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了超过 1400 篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出所有 Golang 教程