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

aet*_*ter 564 string multiline go

Go是否有类似于python的多行字符串:

"""line 1
line 2
line 3"""
Run Code Online (Sandbox Code Playgroud)

如果没有,编写跨越多行的字符串的首选方法是什么?

Mar*_*ers 910

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

`line 1
line 2
line 3`
Run Code Online (Sandbox Code Playgroud)

  • 作为旁注:调用的"原始引用"不解析转义序列.因此,编写正则表达式模式是字符串文字的首选,因为它们通常包含非标准转义序列,这会使Go编译器抱怨不进行双重转义.它使图案保持清洁并且相对可读. (170认同)
  • 但是在使用endline空格时需要注意这一点.例如,如果在"第1行"之后放置一个空格,它将在编辑器中不可见但存在于字符串中. (9认同)
  • @KyleHeuton:大概Daniele D在他/她的SQL查询中使用反引号字符(正如MySQL用户经常做的那样),并且发现将它表示为\`+"\`"+ \`并打破copy-and很痛苦-过去的能力. (8认同)
  • @DanieleD那是一种轻微的不成熟,但是哪种方言?想必主要是MySQL?http://stackoverflow.com/a/10574031请注意,通过扩展相同的参数,嵌入markdown或shell脚本(如果您选择使用反引号代替`$(abcd)`)会很痛苦. (2认同)
  • 如果人们对 MySQL 遇到问题,请注意,您始终可以设置会话 sql 模式,例如“SET SESSION sql_mode = 'ANSI_QUOTES';”,它将“将”视为标识符引号字符(如反引号引号字符),而不是视为一个字符串引号字符。` 然后只需确保对字符串文字使用撇号 ''`,我见过的每个 SQL 数据库都会这样做。请参阅 https://dev.mysql.com/doc/refman/5.7/en/sql -mode.html#sqlmode_ansi_quotes (2认同)

小智 101

你可以写:

"line 1" +
"line 2" +
"line 3"
Run Code Online (Sandbox Code Playgroud)

这与:

"line 1line 2line3"
Run Code Online (Sandbox Code Playgroud)

与使用后退标记不同,它将保留转义字符.请注意,"+"必须位于"前导"行,即:

"line 1"
+"line 2"
Run Code Online (Sandbox Code Playgroud)

生成错误.

  • 此解决方案与Python的多行字符串不同.它将字符串文字拆分为多行,但字符串本身不包含多行. (29认同)
  • 由于这会保留转义字符,因此可以使用`\n`简单地添加新行,并且更容易使用动态字符串等.如果我是正确的,接受的答案实际上是代码中的静态字符串,使其看起来很漂亮. (2认同)
  • 那不是效率也很低吗?令字符串为 3x 6 个字符序列:6 + 2*6 +3*6 = 36 个字符,最佳分配数量为 18(因为字符串是不可变的,每次添加两个字符串时,都会创建一个长度为两个字符串的新字符串)字符串连接)。 (2认同)

Von*_*onC 36

来自字符串文字:

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

但是,如果你的多行字符串必须包含一个反引号(`),那么你将不得不使用一个解释的字符串文字:

`line one
  line two ` +
"`" + `line three
line four`
Run Code Online (Sandbox Code Playgroud)

你不能直接将反引号(`)放在原始字符串文字(``xx \)中.
你必须使用(如" 如何在反引号字符串中放置反引号? "中所述):

 + "`" + ...
Run Code Online (Sandbox Code Playgroud)


I15*_*159 24

将原始字符串文字用于多行字符串:

func main(){
    multiline := `line 
by line
and line
after line`
}
Run Code Online (Sandbox Code Playgroud)

原始字符串文字

原始字符串文字是后引号之间的字符序列,如`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)
}
Run Code Online (Sandbox Code Playgroud)

级联

可能你想要打破你的长行,你不需要新行.在这种情况下,您可以使用字符串连接.

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

    fmt.Print(multiline) // No new lines here
}
Run Code Online (Sandbox Code Playgroud)

由于""被解释,因此将解释字符串文字转义.

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

    fmt.Print(multiline) // New lines as interpreted \n
}
Run Code Online (Sandbox Code Playgroud)


小智 9

在 Go 中创建多行字符串实际上非常简单。声明或分配字符串值时只需使用反引号 (`) 字符即可。

package main

import (
    "fmt"
)

func main() {
    // String in multiple lines
    str := `This is a
multiline
string.`
    fmt.Println(str + "\n")
    
    // String in multiple lines with tab
    tabs := `This string
        will have
        tabs in it`
    fmt.Println(tabs)
}
Run Code Online (Sandbox Code Playgroud)


ASH*_*EEV 7

去和多线字符串

使用后退标记,您可以使用多行字符串:

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)
}
Run Code Online (Sandbox Code Playgroud)

而不是使用双引号(")或单引号符号('),而是使用反向标记来定义字符串的开头和结尾.然后,您可以跨行包装它.

如果你缩进字符串,请记住空白区域将被计算.

请检查操场并进行实验.


lia*_*iam 5

您可以在内容周围加上``,例如

var hi = `I am here,
hello,
`
Run Code Online (Sandbox Code Playgroud)