ZetCode

Golang strconv.Unquote

最后修改于 2025 年 4 月 20 日

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

strconv.Unquote 函数会移除字符串字面量中的引号。它会解析转义序列并返回实际的字符串值。

Unquote 可以处理单引号、双引号和反引号引用的字符串。如果输入无效,它将返回去引号后的字符串和一个错误。

基本的 strconv.Unquote 示例

strconv.Unquote 最简单的用法是移除字符串中的引号。这里我们演示了成功的去引号和错误处理。

basic_unquote.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    quotedStr := `"Hello, Go!"`
    
    unquoted, err := strconv.Unquote(quotedStr)
    if err != nil {
        fmt.Println("Unquote error:", err)
        return
    }
    
    fmt.Printf("Original: %s\nUnquoted: %s\n", quotedStr, unquoted)
}

我们去除了双引号字符串的引号。检查错误以处理无效输入。成功的去引号会同时打印原始字符串和去引号后的字符串。

处理不同的引号类型

strconv.Unquote 可用于单引号、双引号和反引号。本示例展示了对不同带引号字符串格式的去引号。

quote_types.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    doubleQuoted := `"double quoted"`
    singleQuoted := `'single quoted'`
    backtickQuoted := "`backtick quoted`"
    
    cases := []string{doubleQuoted, singleQuoted, backtickQuoted}
    
    for _, c := range cases {
        unquoted, err := strconv.Unquote(c)
        if err != nil {
            fmt.Printf("Failed to unquote %s: %v\n", c, err)
        } else {
            fmt.Printf("Unquoted: %s\n", unquoted)
        }
    }
}

我们测试了三种不同的引号样式。该函数能正确处理每种类型。请注意,反引号字符串不会处理转义序列。

处理转义序列

Unquote 会解析带引号字符串中的转义序列。本示例演示了常见的转义序列处理。

escape_sequences.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    escapedStr := `"Line 1\nLine 2\tTabbed"`
    
    unquoted, err := strconv.Unquote(escapedStr)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    
    fmt.Println("Unquoted string:")
    fmt.Println(unquoted)
}

字符串包含换行符和制表符转义序列。Unquote 将它们转换为实际的字符。输出显示了格式化的文本。

处理无效输入

Unquote 会对格式错误的带引号字符串返回错误。本示例展示了对各种无效情况的错误处理。

invalid_input.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    testCases := []string{
        `"missing closing quote`,
        `'mixed quotes"`,
        `plain string`,
        `"invalid \x escape"`,
    }
    
    for _, tc := range testCases {
        _, err := strconv.Unquote(tc)
        if err != nil {
            fmt.Printf("Error unquoting '%s': %v\n", tc, err)
        }
    }
}

我们测试了几个无效的带引号字符串。每种情况都会产生特定的错误。错误有助于识别输入字符串的问题所在。

去引号 Unicode 转义序列

Unquote 会处理带引号字符串中的 Unicode 转义序列。本示例演示了对 Unicode 转义的处理。

unicode_escapes.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    unicodeStr := `"Hello \u4e16\u754c"`  // "Hello 世界"
    
    unquoted, err := strconv.Unquote(unicodeStr)
    if err != nil {
        fmt.Println("Error:", err)
        return
    }
    
    fmt.Println("Unquoted:", unquoted)
}

字符串包含中文字符的 Unicode 转义序列。Unquote 将它们转换为实际的 Unicode 字符。输出显示了正确解码的字符串。

与原始字符串比较

反引号引用的字符串不会处理转义序列。本示例比较了对常规字符串和原始字符串的去引号处理。

raw_strings.go
package main

import (
    "fmt"
    "strconv"
)

func main() {
    regular := `"Line 1\nLine 2"`
    raw := "`Line 1\\nLine 2`"
    
    regUnquoted, _ := strconv.Unquote(regular)
    rawUnquoted, _ := strconv.Unquote(raw)
    
    fmt.Println("Regular unquoted:", regUnquoted)
    fmt.Println("Raw unquoted:", rawUnquoted)
}

常规字符串处理了换行符转义,而原始字符串则没有。Unquote 根据它们的引用规则处理这两种情况。输出显示了不同的行为。

实际示例:JSON 字符串处理

这个实际示例展示了在处理 JSON 时使用 Unquote。它演示了从 JSON 字符串中提取和去引号值。

json_processing.go
package main

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

func main() {
    jsonStr := `{"name": "Alice", "age": 30, "city": "New York"}`
    
    // Simulate extracting a JSON string value
    start := strings.Index(jsonStr, `"name": "`) + 8
    end := strings.Index(jsonStr[start:], `"`) + start
    quotedValue := jsonStr[start:end]
    
    name, err := strconv.Unquote(`"` + quotedValue + `"`)
    if err != nil {
        fmt.Println("Error unquoting JSON value:", err)
        return
    }
    
    fmt.Println("Extracted name:", name)
}

我们从 JSON 字符串中提取一个带引号的值并对其进行去引号处理。这模拟了处理需要清理值的 JSON 数据。该示例展示了正确的字符串提取和去引号。

来源

Go strconv 包文档

本教程通过各种场景下的字符串去引号实际示例,介绍了 Go 中的 strconv.Unquote 函数。

作者

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

列出所有 Go 教程