小编典典

golang:给定字符串,输出等效的golang字符串文字

go

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

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

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

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

我一直在寻找的东西基本上等同于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

我在标准库文档中浏览了相当多的内容,但是并没有真正找到与我所寻找的内容相似的内容。希望你们能帮助我。

提前致谢!


阅读 330

收藏
2020-07-02

共1个答案

小编典典

您要使用带有%#v格式化程序的http://golang.org/pkg/fmt/#Sprintf

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

有关具有各种不同类型(包括诸如结构之类的复杂文字)的示例,请参见:http :
//play.golang.org/p/nFAKFObXE5。

fmt软件包中有很多有用的格式动词,因此请确保在其文档中查看摘要。

2020-07-02