【问题标题】:golang: given a string, output an equivalent golang string literalgolang:给定一个字符串,输出一个等价的golang字符串文字
【发布时间】:2021-05-28 11:25:11
【问题描述】:

编写输出有效 go 代码的 go 应用程序可能最好使用内置的“go”包及其一些子包(“go/ast”、“go/token”、“go/printer”、等)。

要创建字符串文字表达式,您需要创建一个 ast.BasicLit:

l := &ast.BasicLit{Kind: token.STRING, Value: "\"Hello world!\""}

在我的 go 程序中,我有一个字符串,我需要创建一个 ast.BasicLit,它在输出时会产生一个字符串文字,它忠实地再现了相同的字符串。为了做到这一点,我必须从字符串中派生一个字符串,该字符串表示表示字符串的 go-syntax 文字。 (这个概念太元了,很难毫不含糊地描述。)

我在 go 中寻找的基本上相当于 Python 内置的 repr()。这是一个与 JavaScript 中的 eval() 操作相反的操作。

一个例子应该有助于说明我在寻找什么。

package main

import (
    "repr"
)

// Assume the operation I'm hoping to find is implemented in the package "repr" as a function called "StrLit()" with the signature "func(v string) string".

func main() {
    println(repr.StrLit("Hello World!"))
    println("a")
    println(repr.StrLit("a"))
    println(repr.StrLit(repr.StrLit("a")))
    println(repr.StrLit("This is a\ntest!"))
    println(repr.StrLit("As is\x00this!"))
}

调用此程序时应输出以下内容:

"Hello World!"
a
"a"
"\"a\""
"This is a\ntest!"
"As is\x00this!"

虽然我的具体问题与字符串有关,但我对通用解决方案感兴趣,该解决方案适用于任何类型(整数类型、浮点类型,甚至复杂类型)的值,如下所示:

package main

import (
    "repr"
)

// Assume this time that repr.StrLit() has the signature "func(v interface{}) string".

func main() {
    var a int = 5
    println(repr.StrLit(a))
    var c complex128 = 1.0+1.0i
    println(repr.StrLit(c))
}

这个程序应该输出:

5
1.0+1.0i

我已经浏览了相当多的标准库文档,但还没有真正找到任何与我正在寻找的内容相近的东西。希望大家能帮帮我。

提前致谢!

【问题讨论】:

    标签: go


    【解决方案1】:

    您希望 http://golang.org/pkg/fmt/#Sprintf 带有 %#v 格式化程序。

    lit := fmt.Sprintf("%#v", "foo") 将打印出“foo”

    请参阅:http://play.golang.org/p/nFAKFObXE5 以获取具有各种不同类型(包括结构等复杂文字)的示例。

    fmt 包有很多有用的格式动词,因此请务必查看其文档中的概要。

    【讨论】:

    • 完美!正是我要找的!非常感谢!
    【解决方案2】:

    这正是你想要的:

    package main
    import "strconv"
    
    func main() {
       println(strconv.Quote("Hello World!"))
       println("a")
       println(strconv.Quote("a"))
       println(strconv.Quote(strconv.Quote("a")))
       println(strconv.Quote("This is a\ntest!"))
       println(strconv.Quote("As is\x00this!"))
    }
    

    https://golang.org/pkg/strconv#Quote

    【讨论】:

      猜你喜欢
      • 2016-05-15
      • 2020-02-06
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多