Go - 是否可以将原始字符串文本转换为解释字符串文本?

8

在Go语言中,将原始字符串字面量转换为解释型字符串字面量是否可行?(请参见语言规范

我有一个原始字符串字面量,但我想在控制台上打印出使用转义序列格式化的文本输出,就像使用解释型字符串字面量一样。

例如,打印此原始字符串字面量将给出:

s := `\033[1mString in bold.\033[0m`
println(s) // \033[1mString in bold.\033[0m

但我希望获得与原结果相同的结果

s := "\033[1mString in bold.\033[0m"
println(s) // String in bold. (In bold)

为了提供背景,我正在尝试使用

print()

打印一个包含转义序列的文本文件的内容。

f, _ := := ioutil.ReadFile("file.txt")
println(string(f))

但是输出的结果是以前的方式。
2个回答

8
使用 strconv.Unquote()
s := `\033[1mString in bold.\033[0m`

s2, err := strconv.Unquote(`"` + s + `"`)
if err != nil {
    panic(err)
}
fmt.Println("normal", s2)

这将输出:

普通 加粗的字符串。

请注意,传递给 strconv.Unquote()string 值必须包含双引号或反引号,并且因为源代码中的 s 不包含包装引号,所以我在前后添加了这些引号,如下所示:

`"` + s + `"`

相关问题:

如何使原始Unicode编码的内容可读?

Golang如何将整数转换为Unicode字符?

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

如何在HTML标签中转换转义字符?


谢谢,@icza。您知道为什么对于从具有相同内容的文件中读取的字符串,后一种情况不起作用吗? - Tshaka Eric Lekholoane
1
@TshakaEricLekholoane 我猜是因为它们的内容不同。将文件内容作为字节打印出来,同时打印 []byte(s),并逐字节比较它们。 - icza

1

首先,如果您没有原始字符串,则需要将其编写为原始字符串,并且不更改像“\n”之类的内容。如果您想返回字节,则需要这样做:

s := "\033[1mString in bold.\033[0m"
rune := string([]rune(s))
b := []byte(rune)
f, err := os.OpenFile("filename.txt", os.O_RDWR, 0644)
if err != nil {
return err
}
if _, err := f.Write(b); err != nil {
    return err
}

采用这种方法,字节不会改变,因此sh265保持不变,并且在从文件中读取后不进行任何其他更改即可返回。

其次,用于读取数据和打印的方法:

bytes, err := os.ReadFile("filename.txt")
if err != nil {
  return err
}
s = strconv.Quote(string(bytes))
fmt.Println(s)

你已经得到了 "\x1b[1m加粗的字符串。\x1b[0m"。


根据问题描述,数据是从一个 .txt 文件中读取的,但我无法理解数据来自何处。请提供更详细的答案。 - Nicholas Fernandes Paolillo
1
@NicholasFernandesPaolillo,你是对的。我赶时间时回答的,但我确定这个答案更好,所以我想分享它。我改进了我的答案。 - Nima Sarayan
1
@NicholasFernandesPaolillo 你教会了我如何在StackOverflow上回答别人的问题;多亏了这个,我对我的回答进行了编辑和改进,使其更加完善。 - Nima Sarayan
请记住不要把它当成个人攻击,你读取字节的方式很好,我已经从中学到了东西并在我的工作中使用了它,我为你的问题点了赞。最好的问候。 - Nicholas Fernandes Paolillo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接