我在Go中的语法树中走来走去,试图找到对某个特定函数的所有调用,然后获取其字符串参数(这是一个文件名,应为字符串文字,而不是其他任何标识符)。我已成功完成此操作,现在有了的ast.BasicLit节点Kind== token.STRING,但其值为Go代码,而不是应具有的字符串值。
ast.BasicLit
Kind== token.STRING
但是我想要相反的东西-类似于eval函数(但仅适用于Go字符串文字)。
您可以使用strconv.Unquote()进行转换(取消引用)。
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>