ZetCode

Golang strconv.AppendQuoteToGraphic

最后修改于 2025 年 4 月 20 日

本教程将介绍如何在 Go 中使用 strconv.AppendQuoteToGraphic 函数。我们将通过实际示例讲解如何使用图形字符进行字符串引用。

strconv.AppendQuoteToGraphic 函数将一个双引号括起来的 Go 字符串字面量附加到一个字节切片中。它会转义不可打印和非图形字符。

当您需要安全地引用包含特殊字符的字符串时,此函数非常有用。它是 Go 的 strconv 包的一部分,用于字符串转换实用程序。

基本的 AppendQuoteToGraphic 示例

此示例展示了 AppendQuoteToGraphic 对包含图形字符的简单字符串的基本用法。

basic_quote.go
package main

import (
    "fmt"
    "strconv"
)

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

我们从一个包含“Prefix: ”的字节切片开始。该函数会附加“Hello, 世界”的引用版本。输出显示了正确引用的字符串。

处理非图形字符

此示例演示了 AppendQuoteToGraphic 如何通过转义非图形字符来处理它们。

non_graphic.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte{}
    str := "Line1\nLine2\tTab\x07Bell"
    
    quoted := strconv.AppendQuoteToGraphic(buf, str)
    fmt.Println(string(quoted))
}

输入字符串包含换行符、制表符和响铃符。这些字符在输出中被转义,以保持引用字符串的可读性和安全性。

附加多个字符串

此示例展示了如何高效地将多个引用字符串附加到缓冲区。

multiple_strings.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    buf := []byte("Data: ")
    strings := []string{"Apple", "Banana", "Cherry"}
    
    for _, s := range strings {
        buf = strconv.AppendQuoteToGraphic(buf, s)
        buf = append(buf, ' ')
    }
    
    fmt.Println(string(buf))
}

我们从一个缓冲区开始,然后附加每个引用字符串,后面跟一个空格。这种模式对于构建具有正确引用的复杂输出很有用。

与 QuoteToGraphic 比较

此示例将 AppendQuoteToGraphicQuoteToGraphic 进行比较,以显示它们的区别。

compare_quote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    str := "Special\tChars"
    
    // Using QuoteToGraphic
    quoted1 := strconv.QuoteToGraphic(str)
    fmt.Println("QuoteToGraphic:", quoted1)
    
    // Using AppendQuoteToGraphic
    buf := []byte("Appended: ")
    quoted2 := strconv.AppendQuoteToGraphic(buf, str)
    fmt.Println("AppendQuoteToGraphic:", string(quoted2))
}

QuoteToGraphic 返回一个新字符串,而 AppendQuoteToGraphic 附加到一个现有的字节切片。根据您的内存分配需求进行选择。

性能注意事项

此示例对 AppendQuoteToGraphic 与字符串连接进行基准测试,以构建引用输出。

performance.go
package main

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

func main() {
    const iterations = 100000
    str := "Test\x1bString"
    
    // Benchmark AppendQuoteToGraphic
    start := time.Now()
    buf := []byte{}
    for i := 0; i < iterations; i++ {
        buf = strconv.AppendQuoteToGraphic(buf[:0], str)
    }
    fmt.Println("AppendQuoteToGraphic:", time.Since(start))
    
    // Benchmark QuoteToGraphic + concatenation
    start = time.Now()
    var s string
    for i := 0; i < iterations; i++ {
        s = strconv.QuoteToGraphic(str)
    }
    _ = s
    fmt.Println("QuoteToGraphic:", time.Since(start))
}

当构建大型输出时,AppendQuoteToGraphic 更高效,因为它避免了中间字符串分配。差异随规模而增长。

处理空字符串

此示例演示了 AppendQuoteToGraphic 如何处理空字符串和仅包含非图形字符的字符串。

empty_strings.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    cases := []string{"", "\x00\x01\x02", "   "}
    
    for _, s := range cases {
        buf := []byte("Result: ")
        quoted := strconv.AppendQuoteToGraphic(buf, s)
        fmt.Println(string(quoted))
    }
}

空字符串被引用为空。非图形字符被转义。空格被保留,因为它们被认为是图形字符。

实际示例:JSON 编码

这个实际示例展示了如何使用 AppendQuoteToGraphic 构建一个简单的 JSON 字符串,并进行适当的转义。

json_encoding.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    data := map[string]string{
        "name":    "Alice\nBob",
        "address": "123 Main St\tApt 4",
    }
    
    buf := []byte{'{'}
    first := true
    
    for k, v := range data {
        if !first {
            buf = append(buf, ',')
        }
        first = false
        
        buf = strconv.AppendQuoteToGraphic(buf, k)
        buf = append(buf, ':')
        buf = strconv.AppendQuoteToGraphic(buf, v)
    }
    
    buf = append(buf, '}')
    fmt.Println(string(buf))
}

我们通过正确引用键和值来构建一个 JSON 对象。该函数确保特殊字符根据 JSON 规则进行转义。

来源

Go strconv 包文档

本教程通过各种场景下使用图形字符进行字符串引用的实际示例,介绍了 Go 中的 strconv.AppendQuoteToGraphic 函数。

作者

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

列出所有 Go 教程