Bagaimana Anda menulis string multiline di Go?


Jawaban:


973

Menurut spesifikasi bahasa, Anda dapat menggunakan string string literal, di mana string dibatasi oleh backticks bukan tanda kutip ganda.

`line 1
line 2
line 3`

176
Sebagai catatan: 'Kutipan mentah' seperti namanya, tidak menguraikan urutan pelarian. Oleh karena itu string literal pilihan untuk menulis pola ekspresi reguler karena biasanya berisi urutan pelarian non-standar yang akan membuat kompiler Go mengeluh tidak melarikan diri ganda. Itu membuat pola bersih dan relatif mudah dibaca.
Tepat

10
Perlu berhati-hati dengan ini saat menggunakan spasi endline. Misalnya jika Anda memberi spasi setelah line 1itu tidak akan terlihat di editor Anda tetapi ada dalam string.
Ory Band

2
@ DanieleleD Itu sedikit nonsequitur, tapi dialek yang mana? Agaknya terutama MySQL? stackoverflow.com/a/10574031 Perhatikan bahwa dengan memperluas argumen yang sama, akan menyulitkan untuk menyematkan penurunan harga, atau skrip shell (jika Anda memilih untuk menggunakan backtick sebagai ganti $(abcd)).
Ivan Vučica

8
@KyleHeuton: Agaknya Daniele D menggunakan karakter backtick dalam kueri SQL-nya (seperti yang sering dilakukan pengguna MySQL), dan merasa sulit untuk harus menyatakannya sebagai `+" "" + `dan memecah copy-and-pastability.
ruakh

1
Sisi buruknya adalah jika Anda menulisnya di dalam kode indentasi, tab akan dimasukkan dalam string, dan untuk menghilangkannya akan membuat kode Anda terlihat jelek. Dalam keadaan seperti itu saya lebih suka menggunakan jawaban Azeem
Lost Crotchet

111

Kamu bisa menulis:

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

yang sama dengan:

"line 1line 2line3"

Tidak seperti menggunakan kutu kembali, itu akan mempertahankan karakter melarikan diri. Perhatikan bahwa "+" harus berada di baris 'terkemuka' yaitu:

"line 1"
+"line 2"

menghasilkan kesalahan.


32
Solusi ini tidak analog dengan string multiline Python. Ini membagi string literal melalui beberapa baris, tetapi string itu sendiri tidak mengandung banyak baris.
Ben Butler-Cole

2
Karena ini mempertahankan karakter pelarian, baris baru dapat ditambahkan dengan mudah \ndan jauh lebih mudah untuk digunakan dengan string dinamis dan semacamnya. Jika saya benar, jawaban yang diterima benar-benar untuk string statis dalam kode agar terlihat cantik.
RisingSun

1
Bukankah itu juga sangat tidak efisien? Biarkan string menjadi 3x a 6 char sequence: 6 + 2 * 6 + 3 * 6 = 36 karakter dialokasikan ketika optimal akan menjadi 18 (karena string tidak dapat diubah, setiap kali Anda menambahkan dua string, string baru dibuat dengan panjang keduanya string digabungkan).
tanggal

@Tidak apa-apa: jika hanya ada string literal, tidak ada perbedaan runtime karena kompiler akan mengoptimalkan. Tetapi ada perbedaan kecil (mikrodetik, atau bahkan nanodetik) dalam waktu kompilasi.
dolmen

Saya percaya ini adalah cara terbaik untuk mendapatkan string multiline literal dengan ujung garis CRLF
ldanilek

39

Dari String literals :

  • literal string baku mendukung multiline (tetapi karakter yang lolos tidak ditafsirkan)
  • string yang diinterpretasikan secara literal menafsirkan karakter yang keluar, seperti ' \n'.

Tetapi, jika string multi-line Anda harus menyertakan backquote (`), maka Anda harus menggunakan string literal yang diartikan:

`line one
  line two ` +
"`" + `line three
line four`

Anda tidak bisa secara langsung memasukkan tanda kutip mundur (`) dalam string string literal (` `xx \).
Anda harus menggunakan (seperti yang dijelaskan dalam " cara menempatkan backquote dalam string backquoted? "):

 + "`" + ...

33

Gunakan literal string mentah untuk string multi-baris:

func main(){
    multiline := `line 
by line
and line
after line`
}

Literal string mentah

Literal string mentah adalah urutan karakter antara kutipan belakang, seperti pada `foo`. Dalam tanda kutip, setiap karakter dapat muncul kecuali kutipan kembali.

Bagian penting adalah bahwa literal mentah bukan hanya multi-line dan menjadi multi-line bukan satu-satunya tujuan dari itu.

Nilai dari string string literal adalah string yang terdiri dari karakter yang tidak diinterpretasi (tersirat UTF-8) antara kutipan; khususnya, garis miring terbalik tidak memiliki arti khusus ...

Jadi lolos tidak akan ditafsirkan dan baris baru antara kutu akan menjadi baris baru yang nyata .

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)
}

Rangkaian

Mungkin Anda memiliki garis panjang yang ingin Anda hancurkan dan Anda tidak perlu garis baru di dalamnya. Dalam hal ini Anda bisa menggunakan penggabungan string.

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

    fmt.Print(multiline) // No new lines here
}

Karena "" ditafsirkan string, literal escape akan diinterpretasikan.

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

    fmt.Print(multiline) // New lines as interpreted \n
}

12

Pergi dan string multiline

Menggunakan kutu belakang Anda dapat memiliki string multiline:

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)
}

Alih-alih menggunakan tanda kutip ganda (“) atau simbol tanda kutip tunggal ('), alih-alih gunakan tanda centang kembali untuk menentukan awal dan akhir string. Anda kemudian dapat membungkusnya melintasi garis.

Jika Anda memasukkan indentasi string, ingat bahwa spasi putih akan dihitung.

Silakan periksa taman bermain dan lakukan percobaan dengannya.


4

Anda dapat menempatkan konten dengan `` di sekitarnya, seperti

var hi = `I am here,
hello,
`

3

Anda harus sangat berhati-hati dalam memformat dan mengatur spasi baris, semuanya penting dan ini adalah contoh yang berfungsi, cobalah 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)
}

3

Anda dapat menggunakan literal mentah. Contoh

s:=`stack
overflow`

0

Bagi saya ini yang saya gunakan jika menambahkan \nbukan masalah.

fmt.Sprintf("Hello World\nHow are you doing today\nHope all is well with your go\nAnd code")

Anda bisa menggunakan raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.