如何在Go中编写多行字符串?


Answers:


972

根据语言规范,您可以使用原始字符串文字,该字符串由反引号而不是双引号分隔。

`line 1
line 2
line 3`

176
附带说明:所谓的“原始报价”不会解析转义序列。因此,可以选择字符串文字来编写正则表达式模式,因为它们通常包含非标准的转义序列,这会使Go编译器抱怨没有两次转义。它使模式保持清洁且相对易读。
2011年

10
但是,在使用端线空格时,需要注意这一点。例如,如果在其后放置一个空格,line 1它将在编辑器中不可见,但在字符串中存在。
Ory乐队

2
@DanieleD这是一个有点荒谬的说法,但是哪个方言呢?想必主要是MySQL吗?stackoverflow.com/a/10574031请注意,通过扩展同一参数,很难嵌入markdown或shell脚本(如果您选择使用backtick代替$(abcd))。
伊万·武西卡(IvanVučica)'16

8
@KyleHeuton:大概Daniele D在他/她的SQL查询中使用了反引号字符(就像MySQL用户经常这样做的那样),发现不得不将其表示为`+“`” +`并破坏了复制粘贴性是很痛苦的。
ruakh

1
不利的一面是,如果您在缩进代码中编写代码,则制表符将包含在字符串中,而摆脱制表符将使您的代码看起来难看。在这种情况下,我更愿意用Azeem的答案
失落的小钩

111

你可以写:

"line 1" +
"line 2" +
"line 3"

与以下内容相同:

"line 1line 2line3"

与使用回勾不同,它将保留转义字符。请注意,“ +”必须在“领先”行上,即:

"line 1"
+"line 2"

产生一个错误。


32
此解决方案与Python的多行字符串不同。它将字符串文字分割为多行,但字符串本身不包含多行。
Ben Butler-Cole

2
由于这保留了转义符,因此可以简单地添加新行,\n并且更容易使用动态字符串等。如果我是正确的,那么可以接受的答案实际上是代码中的静态字符串,以使其看起来更漂亮。
RisingSun '16

1
那不是很没有效率吗?令字符串为3x 6个字符的序列:6 + 2 * 6 + 3 * 6 = 36个字符,当最优值为18时分配(因为字符串是不可变的,每次添加两个字符串都会创建一个新字符串,长度为2串联的字符串)。
6

@ N0thing:如果只有字符串文字,那么编译器将优化运行时间,因此没有差异。但是编译时间之间的差异很小(微秒,甚至纳秒)。
支石墓

我相信这是获取带有CRLF行尾的多行字符串文字的最佳方法
ldanilek

39

字符串文字

  • 原始字符串文字支持多行(但不解释转义字符)
  • 解释字符串字面量解释转义字符,例如' \n'。

但是,如果多行字符串必须包含反引号(`),则必须使用解释后的字符串文字:

`line one
  line two ` +
"`" + `line three
line four`

您不能在原始字符串文字(``xx'')中直接加上反引号(` \)。
您必须使用(如“ 如何在反引号中的字符串中加上反引号? ”中所述):

 + "`" + ...

33

对多行字符串使用原始字符串文字:

func main(){
    multiline := `line 
by line
and line
after line`
}

原始字符串文字

原始字符串文字是反引号之间的字符序列,如中所示`foo`。在引号内,除反引号外,任何字符都可能出现。

一个重要的部分是原始文字不只是多行,而且成为多行并不是其唯一目的。

原始字符串文字的值是由引号之间未解释(隐式为UTF-8编码)字符组成的字符串。特别是反斜杠没有特殊含义...

因此,转义符将不会被解释,刻度线之间的新行将是真正的新行

func main(){
    multiline := `line 
by line \n
and line \n
after line`

    // \n will be just printed. 
    // But new lines are there too.
    fmt.Print(multiline)
}

级联

可能您有长行要中断,并且不需要新行。在这种情况下,您可以使用字符串连接。

func main(){
    multiline := "line " +
            "by line " +
            "and line " +
            "after line"

    fmt.Print(multiline) // No new lines here
}

由于“”被解释为字符串,因此将解释字面量转义。

func main(){
    multiline := "line " +
            "by line \n" +
            "and line \n" +
            "after line"

    fmt.Print(multiline) // New lines as interpreted \n
}

12

去和多行字符串

使用回勾,您可以使用多行字符串:

package main

import "fmt"

func main() {

    message := `This is a 
Multi-line Text String
Because it uses the raw-string back ticks 
instead of quotes.
`

    fmt.Printf("%s", message)
}

不要使用双引号(“)或单引号('),而应使用反引号定义字符串的开头和结尾。然后,您可以将其跨行包装。

如果您缩进字符串,请记住空格将起作用。

请检查游乐场并进行实验。


4

您可以在内容周围加上``

var hi = `I am here,
hello,
`

3

您必须非常注意格式和行间距,一切都很重要,这是一个有效的示例,请尝试一下https://play.golang.org/p/c0zeXKYlmF

package main

import "fmt"

func main() {
    testLine := `This is a test line 1
This is a test line 2`
    fmt.Println(testLine)
}


0

对我来说,如果添加\n没有问题,这就是我要使用的东西。

fmt.Sprintf("Hello World\nHow are you doing today\nHope all is well with your go\nAnd code")

否则您可以使用 raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.