【问题标题】:How to transform Go string literal code to its value?如何将 Go 字符串文字代码转换为其值?
【发布时间】:2018-03-15 15:35:58
【问题描述】:

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

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

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

【问题讨论】:

  • @icza 是的,strconv.Unquote() 似乎完成了这项工作(除了我不希望它触及任何它认为是 HTML 的东西,因为它是文件名写成 go 字符串)。但我检查了“ hello.txt”,它运行良好。您可以发布您的答案,以便我接受。

标签: string go string-literals


【解决方案1】:

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

您应该注意的一件事是 strconv.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"`))

输出(在Go Playground上试试):

 invalid syntax
 invalid syntax
Hi <nil>
Hi! <nil>
First line
Secondline <nil>

【讨论】:

    猜你喜欢
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    • 2012-04-23
    • 2011-12-06
    • 2018-11-13
    • 2016-11-27
    • 1970-01-01
    相关资源
    最近更新 更多