Does Go have anything similar to Python's multiline strings:
"""line 1 line 2 line 3""" If not, what is the preferred way of writing strings spanning multiple lines?
Does Go have anything similar to Python's multiline strings:
"""line 1 line 2 line 3""" If not, what is the preferred way of writing strings spanning multiple lines?
According to the language specification, you can use a raw string literal, where the string is delimited by backticks instead of double quotes.
`line 1 line 2 line 3` line 1 it will be invisible in your editor but present in the string.$(abcd)).SET SESSION sql_mode = 'ANSI_QUOTES'; which will Treat " as an identifier quote character (like the backtick quote character) and not as a string quote character. Then just make sure to use apostrophe ' for string literals which every SQL database I've ever seen does. see dev.mysql.com/doc/refman/5.7/en/…You can write:
"line 1" + "line 2" + "line 3" which is the same as:
"line 1line 2line 3" Unlike using back ticks, it will preserve escape characters. Note that the "+" must be on the 'leading' line - for instance, the following will generate an error:
"line 1" +"line 2" \n and is much easier to work with dynamic strings and such. If I am correct, the accepted answer really is for static strings in code to make it look pretty.Use raw string literals for multi-line strings:
func main(){ multiline := `line by line and line after line` } Raw string literals are character sequences between back quotes, as in
`foo`. Within the quotes, any character may appear except back quote.
A significant part is that is raw literal not just multi-line and to be multi-line is not the only purpose of it.
The value of a raw string literal is the string composed of the uninterpreted (implicitly UTF-8-encoded) characters between the quotes; in particular, backslashes have no special meaning...
So escapes will not be interpreted and new lines between ticks will be real new lines.
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) } Possibly you have long line which you want to break and you don't need new lines in it. In this case you could use string concatenation.
func main(){ multiline := "line " + "by line " + "and line " + "after line" fmt.Print(multiline) // No new lines here } Since " " is interpreted string literal escapes will be interpreted.
func main(){ multiline := "line " + "by line \n" + "and line \n" + "after line" fmt.Print(multiline) // New lines as interpreted \n } From String literals:
\n'. But, if your multi-line string has to include a backquote (`), then you will have to use an interpreted string literal:
`line one line two ` + "`" + `line three line four` You cannot directly put a backquote (`) in a raw string literal (``xx\).
You have to use (as explained in "how to put a backquote in a backquoted string?"):
+ "`" + ... Using back ticks you can have multiline strings:
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) } Instead of using either the double quote (“) or single quote symbols (‘), instead use back-ticks to define the start and end of the string. You can then wrap it across lines.
If you indent the string though, remember that the white space will count.
Please check the playground and do experiments with it.
Creating a multiline string in Go is actually incredibly easy. Simply use the backtick (`) character when declaring or assigning your string value.
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) } For those use cases where readability is more important than performance then i'd suggest this simple method:
func multiline(parts ...string) string { return strings.Join(parts, "\n") } This is how you use it:
multiline( "this", "is a", "multiline", "text", ), It generates:
"this\nis a\nmultiline\ntext" basically
This is a multiline text Why i like it more than the backticks?
Because you can keep things aligned and easy to read:
// With backticks aYmlList := `- first_name: John last_name: Doe - first_name: John last_name: McClane` // With multiline method aYmlList := multiline( "- first_name: John", " last_name: Doe", "- first_name: John", " last_name: McClane", ) You have to be very careful on formatting and line spacing in go, everything counts and here is a working sample, try it 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) } For me, I need to use ` grave accent/backquote and just write a simple test
+ "`" + ... is ugly and inconvenient
so I take a characterfor example: 🐬 U+1F42C to replace it
a demo
myLongData := `line1 line2 🐬aaa🐬 line3 ` // maybe you can use IDE to help you replace all ` to 🐬 myLongData = strings.ReplaceAll(myLongData, "🐬", "`") + "`" v.s. replaceAll(, "🐬", "`")
package main import ( "strings" "testing" ) func multilineNeedGraveWithReplaceAll() string { return strings.ReplaceAll(`line1 line2 line3 🐬aaa🐬`, "🐬", "`") } func multilineNeedGraveWithPlus() string { return `line1 line2 line3` + "`" + "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 -benchmemsee more testing.B
output
goos: windows goarch: amd64 pkg: tutorial/test cpu: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz BenchmarkMultilineWithReplaceAll BenchmarkMultilineWithReplaceAll-8 12572316 89.95 ns/op 24 B/op 1 allocs/op BenchmarkMultilineWithPlus BenchmarkMultilineWithPlus-8 1000000000 0.2771 ns/op 0 B/op 0 allocs/op PASS ok tutorial/test 7.566s Yes, The + "`" has a better performance than the other.