在 Go 中是否可以将原始字符串文字转换为解释字符串文字?(参见语言规范)
\n我有一个原始字符串文字,但我想将使用解释字符串文字 \xe2\x80\x94 得到的内容打印到控制台,即使用转义序列格式化的文本输出。
\n例如,打印这个原始字符串文字给出
\ns := `\\033[1mString in bold.\\033[0m`\nprintln(s) // \\033[1mString in bold.\\033[0m\nRun Code Online (Sandbox Code Playgroud)\n但我想要得到同样的结果
\ns := "\\033[1mString in bold.\\033[0m"\nprintln(s) // String in bold. (In bold)\nRun Code Online (Sandbox Code Playgroud)\n对于上下文,我尝试打印使用转义序列格式化的文本文件的内容
\nf, _ := := ioutil.ReadFile("file.txt")\nprintln(string(f))\nRun Code Online (Sandbox Code Playgroud)\n但输出是前一种方式。
\n编写输出有效go代码的应用程序可能最好使用内置的"go"包及其一些子包("go/ast","go/token","go/printer"等).
要创建字符串文字表达式,您需要创建ast.BasicLit:
l := &ast.BasicLit{Kind: token.STRING, Value: "\"Hello world!\""}
Run Code Online (Sandbox Code Playgroud)
在我的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!"))
}
Run Code Online (Sandbox Code Playgroud)
调用此程序时应输出以下内容:
"Hello World!"
a
"a"
"\"a\""
"This is a\ntest!"
"As is\x00this!"
Run Code Online (Sandbox Code Playgroud)
虽然我的具体问题涉及字符串,但我会对一般解决方案感兴趣,该解决方案可以处理任何类型的值(整数类型,浮点类型,甚至复杂类型),如下所示:
package main
import (
"repr"
)
// Assume this time that …Run Code Online (Sandbox Code Playgroud) 我尝试"\t"从 shell 解析为TAB,但是,它不起作用。
这里我举一个简单的例子。
package main
import (
"flag"
"fmt"
)
func main() {
var sep string
flag.StringVar(&sep, "sep", " ", "separator")
flag.Parse()
fmt.Println("name" + sep + "xxx")
// separator is quoted by golang
fmt.Printf("%q\n", sep)
}
Run Code Online (Sandbox Code Playgroud)
结果:
$ go run main.go -sep '\t'
name\txxx
"\\t"
Run Code Online (Sandbox Code Playgroud)
有简单的解决方案吗?