Bun*_*nyk 3 string go string-literals
我在 Go 中的语法树中走动,试图找到对某个特定函数的所有调用,然后获取其字符串参数(它是一个文件名,应该是字符串文字,而不是任何其他标识符)。我成功了,现在我有了ast.BasicLit带有 的节点Kind == token.STRING,但它的值是Go代码,而不是它应该具有的字符串值。
我发现问题回答了如何进行反向转换 - 从字符串到它代表的 go 代码:golang:给定一个字符串,输出一个等效的 golang 字符串文字
但我想要相反的东西 - 像 eval 函数(但仅适用于 Go 字符串文字)。
您可以使用strconv.Unquote()进行转换(取消引用)。
您应该注意的一件事是,只能取消引号中的字符串(例如以引号 char或反引号 charstrconv.Unquote()开头和结尾),因此如果它不在引号中,您必须手动附加它。"`
例子:
fmt.Println(strconv.Unquote("Hi")) // Error: invalid syntax
fmt.Println(strconv.Unquote(`Hi`)) // Error: invalid syntax
fmt.Println(strconv.Unquote(`"Hi"`)) // Prints "Hi"
fmt.Println(strconv.Unquote(`"Hi\x21"`)) // Prints "Hi!"
// This will print 2 lines:
fmt.Println(strconv.Unquote(`"First line\nSecondline"`))
Run Code Online (Sandbox Code Playgroud)
输出(在Go Playground上尝试):
invalid syntax
invalid syntax
Hi <nil>
Hi! <nil>
First line
Secondline <nil>
Run Code Online (Sandbox Code Playgroud)