有効な 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
標準ライブラリのドキュメントをかなり調べましたが、探しているものに近いものは実際には見つかりませんでした。うまくいけば、皆さんが私を助けてくれます。
前もって感謝します!