英文:
How do you write multiline strings in Go?
问题
Go语言有类似于Python的多行字符串吗?
如果没有,编写跨多行的字符串的首选方法是什么?
英文:
Does Go have anything similar to Python's multiline strings:
<!-- language: lang-python -->
"""line 1
line 2
line 3"""
If not, what is the preferred way of writing strings spanning multiple lines?
答案1
得分: 1346
根据语言规范,您可以使用原始字符串字面量,其中字符串由反引号而不是双引号界定。
`line 1
line 2
line 3`
英文:
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`
答案2
得分: 173
你可以这样写:
"line 1" +
"line 2" +
"line 3"
这与以下写法相同:
"line 1line 2line 3"
与使用反引号不同,它会保留转义字符。请注意,"+" 必须在 'leading' 行上 - 例如,以下写法会生成错误:
"line 1"
+"line 2"
英文:
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"
答案3
得分: 63
使用原始字符串字面量来表示多行字符串:
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将只是被打印出来。
// 但是换行符也在其中。
fmt.Print(multiline)
}
字符串连接
可能你有一行很长的字符串,你想要换行,但是你不需要在其中插入换行符。在这种情况下,你可以使用字符串连接。
func main(){
multiline := "line " +
"by line " +
"and line " +
"after line"
fmt.Print(multiline) // 这里没有换行符
}
由于" "是解释的字符串字面量,转义字符将被解释。
func main(){
multiline := "line " +
"by line \n" +
"and line \n" +
"after line"
fmt.Print(multiline) // 换行符被解释为 \n
}
英文:
Use raw string literals for multi-line strings:
func main(){
multiline := `line
by line
and line
after line`
}
Raw string literals
> 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)
}
Concatenation
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
}
答案4
得分: 47
- 原始字符串字面量支持多行(但转义字符不会被解释)
- 解释字符串字面量会解释转义字符,比如
\n
。
但是,如果你的多行字符串中需要包含一个反引号(`),那么你必须使用一个解释字符串字面量:
`第一行
第二行 ` +
"`" + `第三行
第四行`
你不能直接在原始字符串字面量中放置一个反引号(`xx`)。
你必须使用(如“如何在反引号字符串中放置一个反引号?”中所解释的):
+ "`" + ...
英文:
From String literals:
- raw string literal supports multiline (but escaped characters aren't interpreted)
- interpreted string literal interpret escaped characters, like '
\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?"):
+ "`" + ...
答案5
得分: 16
使用反引号可以创建多行字符串:
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)
}
不使用双引号(")或单引号('),而是使用反引号来定义字符串的开始和结束。然后可以跨多行进行包装。
如果缩进字符串,记住空格也会被计算在内。
请在playground上进行实验。
英文:
Go and multiline strings
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.
答案6
得分: 8
在Go中创建多行字符串实际上非常简单。只需在声明或赋值字符串值时使用反引号(`)字符。
package main
import (
"fmt"
)
func main() {
// 多行字符串
str := `This is a
multiline
string.`
fmt.Println(str + "\n")
// 带有制表符的多行字符串
tabs := `This string
will have
tabs in it`
fmt.Println(tabs)
}
英文:
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)
}
答案7
得分: 5
你可以用``将内容包起来,就像
var hi = `我在这里,
你好,
`
英文:
You can put content with `` around it, like
var hi = `I am here,
hello,
`
答案8
得分: 4
你在go语言中必须非常小心格式和行间距,每一点都很重要,这里有一个可运行的示例,你可以尝试一下 https://play.golang.org/p/c0zeXKYlmF
package main
import "fmt"
func main() {
testLine := `这是测试行1
这是测试行2`
fmt.Println(testLine)
}
英文:
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)
}
答案9
得分: 3
你可以使用原始字符串字面量。
示例
s := `stack
overflow`
英文:
you can use raw literals.
Example
s:=`stack
overflow`
答案10
得分: 3
对于我来说,我需要使用`<sup>重音符号/反引号</sup>并且只是写一个简单的测试
+ ""`" + ..."
很丑陋和不方便
所以我拿一个字符<sup>例如:🐬 U+1F42C</sup>来替换它
一个演示
myLongData := `line1
line2 🐬aaa🐬
line3
` // 可能你可以使用IDE来帮助你将所有的`替换为🐬
myLongData = strings.ReplaceAll(myLongData, ""🐬"", ""`"")
性能和内存评估
<code>+ """"</code> v.s. <code>replaceAll(, ""🐬"", ""
")</code>
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 -benchmem
查看更多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
是的,<code>+ ""`""</code>比其他的性能更好。
英文:
For me, I need to use `<sup> grave accent/backquote</sup> and just write a simple test
+ "`" + ...
is ugly and inconvenient
so I take a character<sup>for example: 🐬 U+1F42C</sup> 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, "🐬", "`")
Performance and Memory Evaluation
<code>+ "`"</code> v.s. <code>replaceAll(, "🐬", "`")</code>
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 -benchmem
see 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 <code>+ "`"</code> has a better performance than the other.
答案11
得分: 1
对于我来说,如果添加\n
不是问题的话,我会使用以下代码:
fmt.Sprintf("Hello World\nHow are you doing today\nHope all is well with your go\nAnd code")
否则,你可以使用原始字符串
:
multiline := `Hello Brothers and sisters of the Code
The grail needs us.
`
英文:
For me this is what I use if adding \n
is not a problem.
fmt.Sprintf("Hello World\nHow are you doing today\nHope all is well with your go\nAnd code")
Else you can use the raw string
multiline := `Hello Brothers and sisters of the Code
The grail needs us.
`
答案12
得分: 0
我使用+
与一个空的第一个字符串。这样可以得到一个相对可读的格式,并且对于const
也有效。
英文:
I use the +
with an empty first string. This allows a somehow readable format and it works for const
.
const jql = "" +
"cf[10705] = '%s' and " +
"status = 10302 and " +
"issuetype in (10002, 10400, 10500, 10501) and " +
"project = 10000"
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论