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

时间:2018-03-15 15:35:59

标签: string go string-literals

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

我找到了一个回答如何进行逆向转换的问题 - 从它代表的字符串到代码:golang: given a string, output an equivalent golang string literal

但我想要相反的东西 - 比如eval函数(但只是Go字符串文字)。

1 个答案:

答案 0 :(得分: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>