ZetCode

Golang strconv.QuoteRune

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 strconv.QuoteRune 函数。我们将通过实际示例涵盖 rune 引用的基础知识。

strconv.QuoteRune 函数将一个 rune 转换为一个带单引号的 Go 字符串字面量。它会在需要时添加引号并转义特殊字符。

当您需要安全地将 rune 表示为字符串字面量时,QuoteRune 非常有用。它能正确处理所有 Unicode 字符和 Go 特定的转义序列。

基本的 strconv.QuoteRune 示例

strconv.QuoteRune 最简单的用法是将一个 rune 转换为带引号的字符串。这里我们演示了 ASCII rune 和 Unicode rune 的基本引用。

basic_quoterune.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r1 := 'A'
    r2 := '世'
    
    q1 := strconv.QuoteRune(r1)
    q2 := strconv.QuoteRune(r2)
    
    fmt.Println("ASCII rune quoted:", q1)
    fmt.Println("Unicode rune quoted:", q2)
}

我们将两个 rune 转换为带引号的字符串。ASCII 字符 'A' 变成 "'A'",而 Unicode 字符 '世' 变成 "'世'"。该函数能正确处理这两种情况。

转义特殊字符

strconv.QuoteRune 会自动转义特殊字符。本示例展示了它如何处理控制字符和引号。

escaping.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r1 := '\n'
    r2 := '\''
    r3 := '\\'
    
    fmt.Println("Newline quoted:", strconv.QuoteRune(r1))
    fmt.Println("Single quote quoted:", strconv.QuoteRune(r2))
    fmt.Println("Backslash quoted:", strconv.QuoteRune(r3))
}

特殊字符会用反斜杠进行转义。换行符会变成 "'\n'",单引号会变成 "'\\''",反斜杠会变成 "'\\\\'。

引用不可打印字符

不可打印字符会使用其转义序列进行引用。本示例展示了 QuoteRune 如何处理各种不可打印的 rune。

non_printable.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    runes := []rune{'\a', '\b', '\f', '\r', '\t', '\v', 0x7F}
    
    for _, r := range runes {
        quoted := strconv.QuoteRune(r)
        fmt.Printf("%U: %s\n", r, quoted)
    }
}

每个不可打印字符都会转换为其转义序列。例如,响铃字符(0x07)会变成 "'\\a'",退格符会变成 "'\\b'"。

与 QuoteRuneToASCII 比较

QuoteRuneToASCII 类似,但它强制输出 ASCII。本示例通过 Unicode 输入比较了这两个函数。

compare_quote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r := '⌘'
    
    q1 := strconv.QuoteRune(r)
    q2 := strconv.QuoteRuneToASCII(r)
    
    fmt.Println("QuoteRune:", q1)
    fmt.Println("QuoteRuneToASCII:", q2)
}

QuoteRune 会按原样保留 Unicode 字符('⌘' 变成 "'⌘'"),而 QuoteRuneToASCII 则使用转义序列("'\\u2318'")。

处理无效的 UTF-8

Go 字符串默认是 UTF-8 编码的,但 rune 可能无效。本示例展示了 QuoteRune 如何处理无效的 Unicode 码点。

invalid_utf8.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Invalid Unicode code point
    r := rune(0xFFFFFFFF)
    
    quoted := strconv.QuoteRune(r)
    fmt.Println("Invalid rune quoted:", quoted)
}

无效的 rune 将使用十六进制转义序列进行引用。对于无效 rune 0xFFFFFFFF,输出将是 "'\\Uffffffff'"。

实际示例:Rune 调试

这个实际示例演示了在字符串处理应用程序中使用 QuoteRune 来调试 rune 值。

debug_runes.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    input := "Hello, 世界!\n"
    
    for _, r := range input {
        quoted := strconv.QuoteRune(r)
        fmt.Printf("%-6U %s\n", r, quoted)
    }
}

我们遍历字符串中的每个 rune,并打印其 Unicode 码点和引用的表示形式。这有助于识别字符串中的特殊字符。

性能注意事项

对于性能关键的代码,了解 QuoteRune 的开销很重要。本示例将 QuoteRune 与手动引用进行基准测试。

performance.go
package main

import (
    "fmt"
    "strconv"
    "time"
)

func manualQuoteRune(r rune) string {
    return "'" + string(r) + "'"
}

func main() {
    const iterations = 1000000
    r := 'A'
    
    // Benchmark QuoteRune
    start := time.Now()
    for i := 0; i < iterations; i++ {
        strconv.QuoteRune(r)
    }
    fmt.Println("QuoteRune duration:", time.Since(start))
    
    // Benchmark manual quoting
    start = time.Now()
    for i := 0; i < iterations; i++ {
        manualQuoteRune(r)
    }
    fmt.Println("Manual quoting duration:", time.Since(start))
}

QuoteRune 比手动引用慢,但它能处理所有边界情况。只有当您能够控制所有可能的输入值时,才应使用手动引用。

来源

Go strconv 包文档

本教程通过各种场景下 rune 引用的实际示例,介绍了 Go 中的 strconv.QuoteRune 函数。

作者

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

列出所有 Go 教程