Golang strconv.AppendQuoteRuneToASCII
最后修改于 2025 年 4 月 20 日
本教程将介绍如何在Go中使用strconv.AppendQuoteRuneToASCII函数。我们将通过实际示例讲解rune引用的基础知识。
strconv.AppendQuoteRuneToASCII函数将一个单引号引用的rune追加到字节切片中。它会转义非ASCII和不可打印字符。
此函数对于在仅限ASCII的环境中安全地包含rune非常有用。它返回一个新的字节切片,将引用的rune追加到原始切片中。
AppendQuoteRuneToASCII基本示例
AppendQuoteRuneToASCII最简单的用法是将一个引用的rune追加到现有的字节切片。这里我们展示了基本功能。
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字符。
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转义。本示例演示了特殊字符的处理。
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的切片。本示例展示了增量构建。
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进行比较
AppendQuoteRuneToASCII与QuoteRuneToASCII相似,但它处理字节切片。本示例展示了这两个函数。
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对于构建输出缓冲区非常高效。本示例将其与字符串连接进行基准测试。
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字符串。
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被正确地引用和转义。整数值被直接追加。
来源
本教程通过在各种场景下引用rune的实际示例,涵盖了Go中的strconv.AppendQuoteRuneToASCII函数。