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

时间:2013-07-22 03:12:30

标签: go

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

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

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

在我的go程序中,我有一个字符串,我需要创建一个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

我看了很多标准的库文档但是没有找到任何看起来与我正在寻找的东西相近的东西。希望你们大家可以帮助我。

提前致谢!

2 个答案:

答案 0 :(得分:12)

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

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

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

fmt软件包有很多有用的格式动词,所以一定要查看它的文档中的纲要。

答案 1 :(得分:0)

这正是您想要的:

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