当前位置: 首页 > 面试题库 >

golang:给定字符串,输出等效的golang字符串文字

燕文昌
2023-03-14
问题内容

最好使用内置的“ go”软件包及其一些子软件包(“ go / ast”,“ go / token”,“ go /
printer”等)编写输出有效的go代码的go应用程序

要创建字符串文字表达式,您需要创建一个ast.BasicLit:

l := &ast.BasicLit{Kind: token.STRING, Value: "\"Hello world!\""}

在我的go程序中,我有一个字符串,我需要创建一个ast.BasicLit,该ast.BasicLit在输出时将生成一个字符串文字,该文字将忠实地再现相同的字符串。为此,我必须从字符串中得出一个字符串,该字符串代表表示该字符串的go-
syntax文字。(这个概念太元了,很难毫不含糊地描述它。)

我一直在寻找的东西基本上等同于Python内置的repr()。您可以将此操作称为JavaScript中eval()的“相反”操作。

一个例子应该有助于说明我在寻找什么。

package main

import (
    "repr"
)

// Assume the operation I'm hoping to find is implemented in the package "repr" as a function called "StrLit()" with the signature "func(v string) string".

func main() {
    println(repr.StrLit("Hello World!"))
    println("a")
    println(repr.StrLit("a"))
    println(repr.StrLit(repr.StrLit("a")))
    println(repr.StrLit("This is a\ntest!"))
    println(repr.StrLit("As is\x00this!"))
}

调用该程序时,应输出以下内容:

"Hello World!"
a
"a"
"\"a\""
"This is a\ntest!"
"As is\x00this!"

尽管我的特定问题是关于字符串的,但我对一种通用解决方案感兴趣,该解决方案适用于以下任何类型的值(整数类型,浮点类型甚至复杂类型):

package main

import (
    "repr"
)

// Assume this time that repr.StrLit() has the signature "func(v interface{}) string".

func main() {
    var a int = 5
    println(repr.StrLit(a))
    var c complex128 = 1.0+1.0i
    println(repr.StrLit(c))
}

程序应输出:

5
1.0+1.0i

我在标准库文档中浏览了相当多的内容,但是并没有真正找到与我所寻找的内容相似的内容。希望你们能帮助我。

提前致谢!


问题答案:

您要使用带有%#v格式化程序的http://golang.org/pkg/fmt/#Sprintf。

lit := fmt.Sprintf("%#v", "foo") 将打印出“ foo”

有关具有各种不同类型(包括诸如结构之类的复杂文字)的示例,请参见:http :
//play.golang.org/p/nFAKFObXE5。

fmt软件包中有很多有用的格式动词,因此请确保在其文档中查看摘要。



 类似资料:
  • 问题内容: 如何获取os.Error的字符串值?即。分配给变量。 问题答案: 例如, 输出:

  • 问题内容: 我有以下代码将数据从stdout输出到文件: 我需要将输出从stdout转换为字符串值而不是文件。我该如何实现? 可能还有另一个函数可以让我将io.Copy行更改为io.Copy(myStringVariable,stdoutPipe),因为我需要读取命令的输出并对其进行一些处理? 提前致谢 问题答案: 您不需要管道,编写器,goroutine等。只需使用Cmd.Output 您可以将

  • 问题内容: 我的应用程序接受来自的指针。 例如 如何使用该指针并获取存储在该位置的值? 问题答案: 免责声明:您可能已经知道,这很危险,如果要在生产应用程序中执行此操作,则最好有一个很好的理由。话虽如此… 您需要做一些事情。这是代码,然后我们将逐步进行介绍。 您可以在Go Playground上运行它。 首先,我们需要将字符串解析为数值。在您的示例中,您给出了一个十六进制数,因此我们将以16为底进

  • 问题内容: 如何获得“ E”输出而不是69? Golang是否具有将字符转换为字节,反之亦然的功能? 问题答案: 解释的字符串文字是使用单个字符的UTF-8编码(可能是多字节)在双引号“”之间的字符序列。在UTF-8中,ASCII字符是单字节,对应于前128个Unicode字符。字符串的行为就像字节片。符文是标识Unicode代码点的整数值。因此, 输出: 读: 进入转换的编程语言规范部分。 Go

  • 如何得到一个“E”的输出而不是69? Golang是否有将字符转换为字节的功能,反之亦然?

  • 获取字符串长度 注意:Go 语言编码方式是 UTF-8,在 UTF-8 中一个汉字占3个字节 package main import "fmt" func main() { str1 := "lnj" fmt.Println(len(str1)) // 3 str2 := "公号:代码情缘" fmt.Println(len(str2)) // 12 } 如果字符串中包含中文,