dt102282 2018-03-15 15:35
浏览 85
已采纳

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

I'm walking around syntax tree in Go, trying to find all calls to some particular function and then get its string argument (it's a file name, and should be string literal, not any other identifier). I'm succeeded with this, and now I have ast.BasicLit node with Kind == token.STRING, but its value is Go code, not a value of the string that it should have.

I found question that answers how to do reverse transformation - from string to go code it represents: golang: given a string, output an equivalent golang string literal

But I want the opposite - something like eval function (but just for Go string literals).

  • 写回答

1条回答 默认 最新

  • duanru6816 2018-03-15 16:07
    关注

    You can use the strconv.Unquote() to do the conversion (unquoting).

    One thing you should be aware of is that strconv.Unquote() can only unquote strings that are in quotes (e.g. start and end with a quote char " or a back quote char `), so you have to manually append that if it's not in quotes.

    Example:

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

    Output (try it on the Go Playground):

     invalid syntax
     invalid syntax
    Hi <nil>
    Hi! <nil>
    First line
    Secondline <nil>
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#hadoop#的问题
  • ¥15 (标签-Python|关键词-socket)
  • ¥15 keil里为什么main.c定义的函数在it.c调用不了
  • ¥50 切换TabTip键盘的输入法
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据