ZetCode

Golang strconv.AppendQuoteToASCII

最后修改于 2025 年 4 月 20 日

本教程讲解如何在 Go 中使用 strconv.AppendQuoteToASCII 函数。我们将通过实际示例介绍 ASCII 格式的字符串引用。

strconv.AppendQuoteToASCII 函数将输入字符串的带双引号的 Go 字符串表示形式附加到字节 slice。它会转义非 ASCII 字符。

当您需要生成仅 ASCII 的输出或与需要 ASCII 编码的系统配合使用时,此函数非常有用。它是 Go 的 strconv 包的一部分。

基本的 AppendQuoteToASCII 示例

strconv.AppendQuoteToASCII 最简单的用法是将一个带引用的字符串附加到字节 slice。这里我们演示基本功能。

basic_append.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Prefix: ")
    str := "Hello, 世界"
    
    result := strconv.AppendQuoteToASCII(buf, str)
    fmt.Println(string(result))
}

我们从一个包含 "Prefix: " 的字节 slice 开始。我们将其附加一个带引用的 "Hello, 世界"。输出中的非 ASCII 字符将被转义。

附加到空 Slice

strconv.AppendQuoteToASCII 可以处理空 slice。此示例演示如何从头开始创建新的带引用的字符串。

empty_slice.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    var buf []byte
    str := "Golang"
    
    result := strconv.AppendQuoteToASCII(buf, str)
    fmt.Println("Result:", string(result))
    fmt.Println("Original buffer:", string(buf))
}

我们从一个空的字节 slice 开始,并附加一个带引用的字符串。原始缓冲区保持不变,因为 AppendQuoteToASCII 返回一个新的 slice。

处理特殊字符

此示例演示了 AppendQuoteToASCII 如何处理输入字符串中的特殊字符和转义序列。

special_chars.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    tests := []string{
        "Line\nBreak",
        "Tab\tHere",
        "Quote\"Inside",
        "Back\\Slash",
        "Bell\aSound",
    }
    
    for _, s := range tests {
        quoted := strconv.AppendQuoteToASCII([]byte{}, s)
        fmt.Println(string(quoted))
    }
}

每个特殊字符在输出中都会被正确转义。该函数处理换行符、制表符、引号、反斜杠和其他特殊字符。

与 QuoteToASCII 比较

虽然 QuoteToASCII 返回一个字符串,但 AppendQuoteToASCII 处理字节 slice。此示例展示了两种方法。

compare.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    str := "Hello\nWorld"
    
    // Using QuoteToASCII
    quotedStr := strconv.QuoteToASCII(str)
    fmt.Println("QuoteToASCII:", quotedStr)
    
    // Using AppendQuoteToASCII
    quotedBytes := strconv.AppendQuoteToASCII([]byte("Bytes: "), str)
    fmt.Println("AppendQuoteToASCII:", string(quotedBytes))
}

在处理字节缓冲区时,AppendQuoteToASCII 更有效,因为它避免了不必要的字符串分配。这两个函数产生相同的引用。

构建 JSON 字符串

这个实际示例展示了如何使用 AppendQuoteToASCII 高效地构建 JSON 字符串值。

json_builder.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    jsonBuf := []byte(`{"name": `)
    name := "Alice \"The Boss\""
    
    jsonBuf = strconv.AppendQuoteToASCII(jsonBuf, name)
    jsonBuf = append(jsonBuf, `}`...)
    
    fmt.Println("JSON:", string(jsonBuf))
}

我们构建一个带有带引号字符串值的 JSON 对象。该函数正确转义字符串内的引号。这种方法对于手动构建 JSON 非常高效。

性能注意事项

对于性能至关重要的代码,预先分配缓冲区空间可以提供帮助。此示例演示了如何优化重复的附加操作。

performance.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Pre-allocate buffer with estimated capacity
    buf := make([]byte, 0, 100)
    
    names := []string{"Alice", "Bob", "Charlie"}
    for _, name := range names {
        buf = strconv.AppendQuoteToASCII(buf, name)
        buf = append(buf, '\n')
    }
    
    fmt.Println("Names list:")
    fmt.Println(string(buf))
}

预先分配缓冲区空间可减少附加操作期间的内存分配。在处理许多字符串或构建大型输出时,这尤其有用。

处理非 ASCII 字符

此示例演示了 AppendQuoteToASCII 如何转义输入字符串中的非 ASCII 字符。

non_ascii.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    tests := []string{
        "Hello, 世界",
        "こんにちは",
        "Привет",
        "🎉 Party!",
    }
    
    for _, s := range tests {
        quoted := strconv.AppendQuoteToASCII([]byte{}, s)
        fmt.Printf("Original: %s\nQuoted: %s\n\n", s, quoted)
    }
}

非 ASCII 字符使用 Go 字符串字面量语法进行转义。这确保输出仅包含 ASCII 字符,使其对仅 ASCII 系统安全。

来源

Go strconv 包文档

本教程通过在各种场景下进行字符串引用的实际示例,涵盖了 Go 中的 strconv.AppendQuoteToASCII 函数。

作者

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

列出所有 Go 教程