如何将 Go 字符串文字代码转换为其值?
How to transform Go string literal code to its value?
我正在查看 Go 中的语法树,试图找到对某个特定函数的所有调用,然后获取它的字符串参数(它是一个文件名,应该是字符串文字,而不是任何其他标识符)。我成功了,现在我有 ast.BasicLit
节点和 Kind == token.STRING
,但它的值是 Go 代码,而不是它应该有的字符串值。
我找到了回答如何进行反向转换的问题 - 从字符串到它表示的代码:golang: given a string, output an equivalent golang string literal
但我想要相反的东西 - 类似于 eval 函数(但仅适用于 Go 字符串文字)。
您可以使用 strconv.Unquote()
进行转换(取消引用)。
您应该注意的一件事是 strconv.Unquote()
只能取消引号中的字符串(例如,以引号字符 "
或反引号字符 [=15= 开始和结束) ]), 所以如果它不在引号中,你必须手动附加它。
示例:
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>
我正在查看 Go 中的语法树,试图找到对某个特定函数的所有调用,然后获取它的字符串参数(它是一个文件名,应该是字符串文字,而不是任何其他标识符)。我成功了,现在我有 ast.BasicLit
节点和 Kind == token.STRING
,但它的值是 Go 代码,而不是它应该有的字符串值。
我找到了回答如何进行反向转换的问题 - 从字符串到它表示的代码:golang: given a string, output an equivalent golang string literal
但我想要相反的东西 - 类似于 eval 函数(但仅适用于 Go 字符串文字)。
您可以使用 strconv.Unquote()
进行转换(取消引用)。
您应该注意的一件事是 strconv.Unquote()
只能取消引号中的字符串(例如,以引号字符 "
或反引号字符 [=15= 开始和结束) ]), 所以如果它不在引号中,你必须手动附加它。
示例:
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>