7

有効な 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

標準ライブラリのドキュメントをかなり調べましたが、探しているものに近いものは実際には見つかりませんでした。うまくいけば、皆さんが私を助けてくれます。

前もって感謝します!

4

2 に答える 2

14

%#v フォーマッタでhttp://golang.org/pkg/fmt/#Sprintfが必要です。

lit := fmt.Sprintf("%#v", "foo")「foo」を出力します

構造体のような複雑なリテラルを含むさまざまな型の例については、 http: //play.golang.org/p/nFAKFObXE5を参照してください。

fmt パッケージには便利なフォーマット動詞がたくさんあるので、そのドキュメントで概要を確認してください。

于 2013-07-22T03:47:24.827 に答える