Go'da çok satırlı dizeleri nasıl yazıyorsunuz?


Yanıtlar:


973

Dil belirtimine göre , dizenin çift tırnak yerine ters tırnaklarla sınırlandığı ham dize hazır bilgisi kullanabilirsiniz.

`line 1
line 2
line 3`

176
Bir yan not olarak: 'Ham alıntı' olarak adlandırılır, kaçış dizilerini ayrıştırmaz. Bu nedenle, genellikle Go derleyicisinin çift kaçıştan şikayet etmemesine neden olacak standart olmayan kaçış dizileri içerdiğinden, düzenli ifade kalıpları yazmak için tercih edilen dize değişmezidir. Desenleri temiz ve nispeten okunabilir tutar.
jimt

10
Yine de son satır boşluklarını kullanırken buna dikkat etmelisiniz. Örneğin, boşluk bıraktıktan sonra line 1editörünüzde görünmez olacak, ancak dizede bulunacaksınız.
Ory Band

2
@DanieleD Bu hafif bir eşitsiz, ama hangi lehçe? Muhtemelen esas olarak MySQL? stackoverflow.com/a/10574031 Aynı argümanı genişleterek, işaretleme veya kabuk komut dosyaları yerleştirmek için bir acı olduğunu unutmayın (yerine backtick kullanmayı tercih ederseniz $(abcd)).
Ivan Vučica

8
@KyleHeuton: Muhtemelen Daniele D, SQL sorgularında (MySQL kullanıcılarının sıklıkla yaptığı gibi) backtick karakterini kullanıyor ve bunu `` + "` `+ '' olarak temsil etmenin ve kopyala-ve-makarnalabilirliği kırmanın acı verici buluyor.
ruakh

1
Bunun aşağı tarafı, girintili kodun içine yazıyorsanız, sekmelere dizeye dahil edilecek ve bunlardan kurtulmak kodunuzu çirkin gösterecektir. Bu koşullar altında Azeem'in cevabını kullanmayı tercih ederim
Lost Crotchet

111

Yazabilirsin:

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

ki aynı:

"line 1line 2line3"

Geri keneler kullanmanın aksine, kaçış karakterlerini koruyacaktır. "+" İfadesinin "satır aralığı" satırında olması gerektiğini unutmayın:

"line 1"
+"line 2"

bir hata oluşturur.


32
Bu çözüm Python'un çok satırlı dizelerine benzemez. Dize değişmezini birden çok satıra böler, ancak dizenin kendisi birden çok satır içermez.
Ben Butler-Cole

2
Bu, kaçış karakterlerini koruduğundan, yeni satırlar basitçe eklenebilir \nve dinamik dizelerle ve benzeriyle çalışmak daha kolaydır. Doğruysam, kabul edilen cevap gerçekten güzel görünmesi için koddaki statik dizeler içindir.
RisingSun

1
Bu da çok verimsiz olmaz mı? Dizenin 3x a 6 karakter dizisi olmasına izin verin: 6 + 2 * 6 + 3 * 6 = 36 karakter en uygun olduğunda 18 olur (dizeler değişmez olduğu için, her iki dizge eklediğinizde iki dizinin uzunluğu ile yeni bir dize oluşturulur dizeler birleştirilmiş).
N0thing

@ N0thing: Yalnızca dize değişmezleri varsa, derleyici optimize edeceği için çalışma zamanı farklılıkları yoktur. Ancak derleme süresinde küçük (mikrosaniye, hatta nanosaniye) bir fark vardır.
dolmen

Bunun CRLF satır sonları ile çok satırlı bir dizgi hazır bilgisi elde etmenin en iyi yolu olduğuna inanıyorum
ldanilek

39

Gönderen Dize değişmezleri :

  • raw string literal çok satırlı desteği destekler (ancak çıkış karakterleri yorumlanmaz)
  • yorumlanmış dize hazır bilgisi ' \n' gibi kaçan karakterleri yorumlar .

Ancak, çok satırlı dizenizin bir backquote (`) içermesi gerekiyorsa, yorumlanmış bir dize değişmezi kullanmanız gerekir:

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

Ham dize değişmezine (`` xx) doğrudan bir arka tırnak (`) koyamazsınız\ ) .
Kullanmanız gerekir ("geri alıntılanmış bir dizeye backquote nasıl eklenir? " Bölümünde açıklandığı gibi ):

 + "`" + ...

33

Çok satırlı dizeler için ham dize değişmezlerini kullanın:

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

Ham dize değişmez değerleri

Ham dize değişmezleri, olduğu gibi arka tırnak işaretleri arasındaki karakter dizileridir `foo`. Tırnak işaretleri içinde, geri alıntı dışında herhangi bir karakter görünebilir.

Önemli bir nokta, sadece çok satırlı değil, çok satırlı olmanın da tek amacı ham değişmez olmasıdır.

Ham dize değişmezinin değeri, tırnak işaretleri arasında yorumlanmamış (örtük olarak UTF-8 kodlu) karakterlerden oluşan dizedir; özellikle ters eğik çizgilerin özel bir anlamı yoktur ...

Yani kaçışlar yorumlanmayacak ve keneler arasındaki yeni çizgiler gerçek yeni çizgiler olacak .

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

birbirine bağlama

Muhtemelen kırmak istediğiniz uzun bir hattınız var ve içinde yeni hatlara ihtiyacınız yok. Bu durumda dize birleştirme kullanabilirsiniz.

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

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

"" Yorumlandığı için dizgi değişmez kaçışları yorumlanacaktır.

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

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

12

Git ve çok satırlı dizeler

Geri keneler kullanarak çok satırlı dizelere sahip olabilirsiniz:

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

Çift tırnak işareti (“) ya da tek tırnak işareti sembolleri (') kullanmak yerine, dizenin başlangıcını ve sonunu tanımlamak için geri kene kullanın. Daha sonra satırlar boyunca sarabilirsiniz.

Dizeyi girintili yaparsanız, beyaz boşluğun sayılacağını unutmayın.

Lütfen oyun alanını kontrol edin ve onunla deneyler yapın.


4

İçeriği `` etrafına,

var hi = `I am here,
hello,
`

3

Biçimlendirme ve satır aralığı konusunda çok dikkatli olmalısınız, her şey önemlidir ve burada çalışan bir örnek, bunu deneyin 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

ham değişmez değerleri kullanabilirsiniz. Misal

s:=`stack
overflow`

0

Benim için eklemek \nbir sorun değilse kullandığım budur.

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

Başka kullanabilirsiniz raw string

multiline := `Hello Brothers and sisters of the Code
              The grail needs us.
             `
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.