ZetCode

Golang strconv.AppendQuoteRuneToASCII

最后修改于 2025 年 4 月 20 日

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

strconv.AppendQuoteRuneToASCII函数将一个单引号引用的rune追加到字节切片中。它会转义非ASCII和不可打印字符。

此函数对于在仅限ASCII的环境中安全地包含rune非常有用。它返回一个新的字节切片,将引用的rune追加到原始切片中。

AppendQuoteRuneToASCII基本示例

AppendQuoteRuneToASCII最简单的用法是将一个引用的rune追加到现有的字节切片。这里我们展示了基本功能。

basic_append.go
package main

import (
    "fmt"
    "strconv"
)

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

我们从一个包含“Rune: ”的字节切片开始。我们向其中追加一个引用的'A' rune。输出显示了原始文本以及追加的引用的rune。

追加非ASCII rune

AppendQuoteRuneToASCII会转义非ASCII rune。本示例展示了它如何处理ASCII范围之外的Unicode字符。

non_ascii.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Symbol: ")
    r := '€'  // Euro sign (U+20AC)
    
    result := strconv.AppendQuoteRuneToASCII(buf, r)
    fmt.Println(string(result))
}

欧元符号(€)不在ASCII范围内,因此会被转义。输出显示了Unicode转义序列而不是实际字符。

追加控制字符

控制字符也会被AppendQuoteRuneToASCII转义。本示例演示了特殊字符的处理。

control_chars.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Control: ")
    r := '\n'  // Newline character
    
    result := strconv.AppendQuoteRuneToASCII(buf, r)
    fmt.Println(string(result))
}

换行符在输出中被转义为'\n'。这使得该字符可见,并且对于仅限ASCII的环境是安全的。

构建一个引用的Rune切片

我们可以使用AppendQuoteRuneToASCII来构建一个包含多个引用的Rune的切片。本示例展示了增量构建。

building_slice.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    var buf []byte
    runes := []rune{'H', 'e', 'l', 'l', 'o', ' ', '世', '界'}
    
    for _, r := range runes {
        buf = strconv.AppendQuoteRuneToASCII(buf, r)
        buf = append(buf, ' ')
    }
    
    fmt.Println(string(buf))
}

我们从一个空字节切片开始,并逐个追加引用的rune。非ASCII rune(世和界)被转义。为了易读性,在引用的rune之间添加了空格。

与QuoteRuneToASCII进行比较

AppendQuoteRuneToASCIIQuoteRuneToASCII相似,但它处理字节切片。本示例展示了这两个函数。

comparison.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    r := '¶'  // Pilcrow sign
    
    // Using QuoteRuneToASCII
    quoted := strconv.QuoteRuneToASCII(r)
    fmt.Println("QuoteRuneToASCII:", quoted)
    
    // Using AppendQuoteRuneToASCII
    buf := []byte("AppendQuoteRuneToASCII: ")
    result := strconv.AppendQuoteRuneToASCII(buf, r)
    fmt.Println(string(result))
}

这两个函数产生相同的引用输出,但AppendQuoteRuneToASCII处理现有的字节切片。这对于构建输出更有效。

性能注意事项

AppendQuoteRuneToASCII对于构建输出缓冲区非常高效。本示例将其与字符串连接进行基准测试。

performance.go
package main

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

func main() {
    const iterations = 100000
    runes := []rune{'a', 'b', 'c', '1', '2', '3', '§', '©'}
    
    // Benchmark AppendQuoteRuneToASCII
    start := time.Now()
    var buf []byte
    for i := 0; i < iterations; i++ {
        for _, r := range runes {
            buf = strconv.AppendQuoteRuneToASCII(buf, r)
        }
        buf = buf[:0]  // Reset buffer
    }
    fmt.Println("AppendQuoteRuneToASCII:", time.Since(start))
    
    // Benchmark string concatenation
    start = time.Now()
    var s string
    for i := 0; i < iterations; i++ {
        for _, r := range runes {
            s += strconv.QuoteRuneToASCII(r)
        }
        s = ""  // Reset string
    }
    fmt.Println("String concatenation:", time.Since(start))
}

对于构建大型输出,AppendQuoteRuneToASCII比字符串连接快得多。它避免了重复的内存分配。

实际示例:JSON 编码

这个实际示例演示了如何使用AppendQuoteRuneToASCII来构建一个具有正确转义的简单JSON字符串。

json_encoding.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    var buf []byte
    name := "José"
    value := 42
    
    buf = append(buf, `{"name":"`...)
    for _, r := range name {
        buf = strconv.AppendQuoteRuneToASCII(buf, r)
    }
    buf = append(buf, `","value":`...)
    buf = strconv.AppendInt(buf, int64(value), 10)
    buf = append(buf, '}')
    
    fmt.Println(string(buf))
}

我们构建了一个包含非ASCII字符的字符串的JSON对象。rune被正确地引用和转义。整数值被直接追加。

来源

Go strconv 包文档

本教程通过在各种场景下引用rune的实际示例,涵盖了Go中的strconv.AppendQuoteRuneToASCII函数。

作者

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

列出所有 Go 教程