一尘不染

如何将Go字符串文字代码转换为其值?

go

我在Go中的语法树中走来走去,试图找到对某个特定函数的所有调用,然后获取其字符串参数(这是一个文件名,应为字符串文字,而不是其他任何标识符)。我已成功完成此操作,现在有了的ast.BasicLit节点Kind== token.STRING,但其值为Go代码,而不是应具有的字符串值。

但是我想要相反的东西-类似于eval函数(但仅适用于Go字符串文字)。


阅读 244

收藏
2020-07-02

共1个答案

一尘不染

您可以使用strconv.Unquote()进行转换(取消引用)。

您应该注意的一件事是,strconv.Unquote()只能取消用引号引起来的字符串(例如,以引号char "或反引号char
开头和结尾```),因此,如果不在引号中,则必须手动将其附加。

例:

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"`))

输出(在Go Playground上尝试):

 invalid syntax
 invalid syntax
Hi <nil>
Hi! <nil>
First line
Secondline <nil>
2020-07-02