编写输出有效 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
我已经浏览了很多标准库文档,但没有真正找到任何看起来接近我正在寻找的内容。希望大家能帮助我。
提前致谢!
您需要 https://golang.org/pkg/fmt/#Sprintf 以及 %#v 格式化程序。
lit := fmt.Sprintf("%#v", "foo")
将打印出来 "foo"
请参阅:https://play.golang.org/p/nFAKFObXE5,了解各种不同类型的示例,包括结构体等复杂文字。
fmt 包有很多有用的格式动词,所以一定要查看其文档中的概要。
这正是您想要的:
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!"))
}