Goで複数行の文字列をどのように記述しますか?


回答:


973

言語仕様によると、文字列は二重引用符の代わりにバッククォートで区切られた生の文字列リテラルを使用できます。

`line 1
line 2
line 3`

176
補足として、呼び出された「生の引用」はエスケープシーケンスを解析しません。正規表現のパターンは通常、非標準のエスケープシーケンスを含むため、文字列リテラルを選択すると、Goコンパイラーがダブルエスケープされないというエラーメッセージが表示されます。それはパターンをクリーンで比較的読みやすい状態に保ちます。
2010年

10
ただし、エンドラインスペースを使用する場合は注意が必要です。たとえば、スペースをline 1エディターの後に表示されないが、文字列には存在する場合、スペースを置くと
Ory Band、2015

2
@DanieleDそれはわずかなnonsequiturですが、どの方言ですか?おそらく主にMySQLですか?stackoverflow.com/a/10574031同じ引数を拡張すると、markdownやシェルスクリプト(の代わりにバックティックを使用する場合)を埋め込むのが面倒になることに注意してください$(abcd)
IvanVučica16年

8
@KyleHeuton:おそらくダニエルDがSQLクエリでバックティック文字を使用しているため(MySQLユーザーがよく行うように)、 `+" `" + `として表現し、コピーアンドペースト性を損なう必要があるのは苦痛です。
-ruakh

1
これの欠点は、インデントされたコード内に記述している場合、タブが文字列に含まれ、タブを取り除くとコードが醜く見えることです。そのような状況下では、Azeemの回答を使用したいと思います
Lost Crotchet

111

あなたは書ける:

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

これは次と同じです:

"line 1line 2line3"

バックティックの使用とは異なり、エスケープ文字は保持されます。「+」は「先頭」行にある必要があることに注意してください。

"line 1"
+"line 2"

エラーが発生します。


32
このソリューションは、Pythonの複数行の文字列に類似していません。文字列リテラルを複数行に分割しますが、文字列自体には複数行は含まれません。
Ben Butler-Cole

2
これはエスケープ文字を保持するので、新しい行を簡単に追加でき\n、動的文字列などを扱うのがはるかに簡単になります。私が正しければ、受け入れられた答えは実際にはコード内の静的文字列がきれいに見えるようにすることです。
RisingSun

1
それも非常に非効率的ではないでしょうか?文字列を6文字のシーケンスの3倍にします。6+ 2 * 6 + 3 * 6 = 36文字が最適な場合に割り当てられます(文字列は不変であるため、2つの文字列を追加するたびに、2つの長さの新しい文字列が作成されます)連結された文字列)。
N0thing

@ N0thing:文字列リテラルのみがある場合、コンパイラーが最適化するため、実行時の違いはありません。ただし、コンパイル時間にはわずかな(マイクロ秒、またはナノ秒)の違いがあります。
ドルメン2017

これは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

Goとマルチライン文字列

バックティックを使用すると、複数行の文字列を使用できます。

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

goのフォーマットと行間隔には細心の注意を払う必要があります。すべてが重要です。ここに実際のサンプルがあります。試してみてください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.
             `
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.