2013-07-22 110 views
2

編寫go應用程序輸出有效的go代碼可能是使用內置的「go」包和它的一些子包(「go/ast」, 「去/令牌」,「去/打印機」等)。golang:給出一個字符串,輸出一個等效的golang字符串

創建一個字符串字面表達,你需要創建一個ast.BasicLit:

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

在我的圍棋程序,我有一個字符串,我需要創建一個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!" 

雖然我的具體問題方面的字符串,我很想在一個通用的解決方案,其將在任何類型的工作值(整數類型,float類型,即使是複雜的類型),如下所示:

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 

我已經看了很多通過標準庫文檔,但還沒有真正發現任何東西看起來接近我正在尋找。希望你們可以幫助我。

在此先感謝!

回答

7

你想要http://golang.org/pkg/fmt/#Sprintf與%#v格式化程序。

lit := fmt.Sprintf("%#v", "foo")將打印出「富」

參見:http://play.golang.org/p/nFAKFObXE5用於與各種不同類型的包括複雜的文字等結構的例子。

fmt軟件包有很多有用的格式動詞,因此一定要查看它的文檔中的簡介。

+0

完美!正是我在找什麼!非常感謝! – AntiMS

相關問題