最好使用内置的“ 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
我在标准库文档中浏览了相当多的内容,但是并没有真正找到与我所寻找的内容相似的内容。希望你们能帮助我。
提前致谢!
您要使用带有%#v格式化程序的http://golang.org/pkg/fmt/#Sprintf。
lit := fmt.Sprintf("%#v", "foo") 将打印出“ foo”
lit := fmt.Sprintf("%#v", "foo")
有关具有各种不同类型(包括诸如结构之类的复杂文字)的示例,请参见:http : //play.golang.org/p/nFAKFObXE5。
fmt软件包中有很多有用的格式动词,因此请确保在其文档中查看摘要。