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

Go有类似于Python的多行字符串吗:

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

如果不是,那么编写跨越多行的字符串的首选方式是什么?

385133 次浏览

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

`line 1line 2line 3`

你可以写:

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

这与:

"line 1line 2line 3"

与使用反向刻度不同,它将保留转义字符。请注意,“+”必须在“前导”行上-例如,以下内容将生成错误:

"line 1"+"line 2"

字符串文字

  • 原始字符串文字支持多行(但转义字符不被解释)
  • 解释字符串文字解释转义字符,如“\n”。

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

`line oneline two ` +"`" + `line threeline four`

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

 + "`" + ...

你可以把内容与“围绕它,就像

var hi = `I am here,hello,`

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

func main(){multiline := `lineby lineand lineafter line`}

原始字符串文字

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

一个重要的部分是原始字面量不仅仅是多行,多行也不是它的唯一目的。

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

所以转义不会被解释和刻度之间的新行将是真正的新行

func main(){multiline := `lineby line \nand line \nafter 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}

你必须非常小心格式化和行距,一切都很重要,这是一个工作示例,试试看https://play.golang.org/p/c0zeXKYlmF

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

您可以使用原始文字。示例

s:=`stackoverflow`

go和多行字符串

使用反向刻度,您可以拥有多行字符串:

package main
import "fmt"
func main() {
message := `This is aMulti-line Text StringBecause it uses the raw-string back ticksinstead of quotes.`
fmt.Printf("%s", message)}

不要使用双引号(")或单引号符号('),而是使用反引号来定义字符串的开始和结束。然后您可以跨行包装它。

如果您缩进字符串,请记住空白将计数。

请检查游乐场 并用它做实验。

对我来说,如果添加\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 CodeThe grail needs us.`

对我来说,我需要使用' 重音/反引号并编写一个简单的测试

+ "`" + ...

既丑陋又不方便

所以我用一个字符例如:🐬U+1F42C来替换它


一个演示

myLongData := `line1line2 🐬aaa🐬line3` // maybe you can use IDE to help you replace all ` to 🐬myLongData = strings.ReplaceAll(myLongData, "🐬", "`")

Go Playground

性能和内存评估

+ "`" vs. s.replaceAll(, "🐬", "`")

package main
import ("strings""testing")
func multilineNeedGraveWithReplaceAll() string {return strings.ReplaceAll(`line1line2line3 🐬aaa🐬`, "🐬", "`")}
func multilineNeedGraveWithPlus() string {return `line1line2line3` + "`" + "aaa" + "`"}
func BenchmarkMultilineWithReplaceAll(b *testing.B) {for i := 0; i < b.N; i++ {multilineNeedGraveWithReplaceAll()}}
func BenchmarkMultilineWithPlus(b *testing.B) {for i := 0; i < b.N; i++ {multilineNeedGraveWithPlus()}}

cmd

go test -v -bench=. -run=none -benchmem查看更多测试. B

输出

goos: windowsgoarch: amd64pkg: tutorial/testcpu: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHzBenchmarkMultilineWithReplaceAllBenchmarkMultilineWithReplaceAll-8    12572316      89.95 ns/op   24 B/op  1 allocs/opBenchmarkMultilineWithPlusBenchmarkMultilineWithPlus-8          1000000000   0.2771 ns/op    0 B/op  0 allocs/opPASSok      tutorial/test   7.566s

是的,+ "`"比另一个具有更好的性能。

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

package main
import ("fmt")
func main() {// String in multiple linesstr := `This is amultilinestring.`fmt.Println(str + "\n")    
// String in multiple lines with tabtabs := `This stringwill havetabs in it`fmt.Println(tabs)}