ZetCode

Golang strconv.AppendQuoteRuneToGraphic

最后修改于 2025 年 4 月 20 日

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

strconv.AppendQuoteRuneToGraphic 函数将表示该 rune 的单引号 Go 字符文字追加到字节切片。它通过转义特殊字符来处理它们。

当您需要安全地为输出或序列化引用 rune 时,此函数特别有用。它确保非打印字符和特殊字符被正确转义。

基本的 AppendQuoteRuneToGraphic 示例

AppendQuoteRuneToGraphic 的最简单用法是将引用的 rune 追加到字节切片。这里我们演示了一个可打印字符的基本用法。

basic_append.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Rune: ")
    r := 'A'
    
    result := strconv.AppendQuoteRuneToGraphic(buf, r)
    fmt.Println(string(result))
}

我们从一个包含 "Rune: " 的字节切片开始。该函数将 'A' 的引用版本追加到此切片。输出显示了正确引用的字符。

处理特殊字符

AppendQuoteRuneToGraphic 会自动转义特殊字符。此示例显示了它如何处理换行符和制表符。

special_chars.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    testCases := []rune{'\n', '\t', '\'', '\\'}
    
    for _, r := range testCases {
        buf := []byte("Rune: ")
        quoted := strconv.AppendQuoteRuneToGraphic(buf, r)
        fmt.Println(string(quoted))
    }
}

我们测试了各种需要转义的特殊字符。该函数正确引用了每个字符,并在必要时使用 Go 转义序列。

处理非打印字符

此函数也能正确处理非打印字符。此示例演示了引用控制字符。

non_printable.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Control char: ")
    r := rune(0x7F) // DEL character
    
    result := strconv.AppendQuoteRuneToGraphic(buf, r)
    fmt.Println(string(result))
}

DEL 字符 (0x7F) 是非打印字符。该函数使用十六进制表示法转义它,使其可以安全地输出。

追加多个 Rune

虽然它设计用于单个 rune,但我们可以在循环中使用此函数来处理多个字符。此示例展示了如何操作。

multiple_runes.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    input := "Hello\n世界"
    buf := []byte("Quoted: ")
    
    for _, r := range input {
        buf = strconv.AppendQuoteRuneToGraphic(buf, r)
        buf = append(buf, ' ') // Add space between quoted runes
    }
    
    fmt.Println(string(buf))
}

我们单独处理字符串中的每个 rune。该函数能正确处理 ASCII 和 Unicode 字符,并在需要时进行转义。

与 QuoteRuneToGraphic 比较

AppendQuoteRuneToGraphic 类似于 QuoteRuneToGraphic,但它处理字节切片。此示例比较了两者。

comparison.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r := 'ß' // German sharp s
    
    // Using QuoteRuneToGraphic
    quotedStr := strconv.QuoteRuneToGraphic(r)
    fmt.Println("String version:", quotedStr)
    
    // Using AppendQuoteRuneToGraphic
    buf := []byte("Byte slice version: ")
    quotedBytes := strconv.AppendQuoteRuneToGraphic(buf, r)
    fmt.Println(string(quotedBytes))
}

这两个函数都产生相同的引用表示。在增量构建输出时,追加版本更有效。

性能注意事项

为了构建大的引用输出,预先分配缓冲区空间可以提高性能。此示例演示了该技术。

performance.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    input := "This is a test string with \t and \n"
    // Pre-allocate buffer with estimated capacity
    buf := make([]byte, 0, len(input)*3)
    
    for _, r := range input {
        buf = strconv.AppendQuoteRuneToGraphic(buf, r)
        buf = append(buf, ' ')
    }
    
    fmt.Println("Result:", string(buf))
}

预分配减少了追加操作期间的内存分配。容量估算考虑了引用的 rune 比原始字符更长。

实际示例:类似 JSON 的输出

这个实际示例演示了如何使用该函数来创建具有正确转义字符的类似 JSON 的输出。

json_output.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    userInput := "Name\tAge\nAlice\t25\nBob\t30"
    buf := []byte(`{"description": `)
    
    // Start array of quoted runes
    buf = append(buf, '[')
    for i, r := range userInput {
        if i > 0 {
            buf = append(buf, ',', ' ')
        }
        buf = strconv.AppendQuoteRuneToGraphic(buf, r)
    }
    buf = append(buf, ']', '}')
    
    fmt.Println(string(buf))
}

我们创建了一个类似 JSON 的结构,其中每个字符都得到了妥善引用。输入中的特殊字符会自动转义,以实现安全的 JSON 输出。

来源

Go strconv 包文档

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

作者

我的名字是 Jan Bodnar,我是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教授编程方面拥有超过十年的经验。

列出所有 Go 教程