Як ви записуєте багаторядкові рядки в Go?

Чи має Go щось подібне до багаторядкових рядків python:

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

Якщо ні, то який спосіб написання рядків охоплює кілька рядків?

428

6 Відповіді

Відповідно до специфікації мови , ви можете використовувати необроблений буквеносмуговий рядок, де рядок обмежується заставки подвійні лапки.

`line 1
line 2
line 3`
705
додано
Потрібно бути обережним при цьому, використовуючи кінцеві прогалини, хоча. Наприклад, якщо ви помістите пробіл після line 1 , він буде невидимим у вашому редакторі, але присутній у рядку.
додано Автор Ory Band, джерело
@ Данілед Це незначний неценотер, але який діалект? Мабуть, переважно MySQL? stackoverflow.com/a/10574031 Зауважте, що, розширюючи той самий арґумент, це біль для вбудовування скидання або скриптів оболонки (якщо ви обираєте використовувати backtick замість $ (abcd) ).
додано Автор Ivan Vučica, джерело
Як бічна примітка: "Сирена цитата", як її називається, не аналізує евакуючі послідовності. Саме тому лінійний буквенний букв вибору набирати шаблони регулярного вираження, оскільки вони зазвичай містять нестандартні евакуаційні послідовності, які змушують компілятор Go не скаржитися на подвійне спадання. Він тримає шаблони чистими і відносно читабельними.
додано Автор jimt, джерело
@DanieleD Що змушує вас сказати, що це біль для sql? Я думаю про його використання для деяких SQL-запитів, тому що мені подобається вміти копіювати та вставляти з мого вихідного коду в інші контексти. Хіба що він не аналізує евакующі послідовності?
додано Автор Kyle Heuton, джерело
Дуже корисно! Спасибі!
додано Автор Felipe Valdes, джерело
Зауважте, що це біль для SQL
додано Автор Daniele D, джерело
Спасибі, я дійсно не знаю, як я пропустив це
додано Автор aeter, джерело
перевірити це повідомлення: steemit.com/programming/ @ elsanto/& hellip;
додано Автор Sanx, джерело

Ви можете написати:

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

яка така ж, як:

"line 1line 2line3"

На відміну від використання списків кліщів, він збереже рятувальні символи. Зауважте, що "+" має бути у рядку "leading", тобто:

"line 1"
+"line 2"

генерує помилку

73
додано
@ N0thing: якщо є лише рядкові літерали, у компіляторі не буде оптимізовано відмінностей у роботі. Але існує невелика різниця у часу компіляції (мікросекунди або навіть наносекунд).
додано Автор dolmen, джерело
Оскільки ці константи рятуються від символів, нові рядки можна просто додати за допомогою \ n і набагато легше працювати з динамічними рядками тощо. Якщо я правильний, прийнята відповідь дійсно стосується статичних рядків у коді, щоб він виглядав красиво.
додано Автор khuderm, джерело
Не було б теж дуже неефективним? Нехай рядок буде 3x 6-символьною послідовністю: 6 + 2 * 6 + 3 * 6 = 36 символів, виділених, коли оптимальним буде 18 (оскільки рядки незмінні, кожен раз, коли ви додасте дві рядки, створюється новий рядок з довжиною двох рядки об'єднані).
додано Автор N0thing, джерело
Це рішення не є аналогічним багаторядкових рядків Python. Він розщеплює рядок буквально на декількох рядках, але сам рядок не містить декількох рядків.
додано Автор Ben Butler-Cole, джерело

З String літералів :

  • необоротний буквенний рядок підтримує багаторядкові (але символи, що втекли, не інтерпретуються)
  • інтерпретований рядок буквальний інтерпретує збережені символи, такі як ' \ n '.

Але якщо ваш багаторядковий рядок повинен включати зворотну пропозицію (`), то вам доведеться використовувати інтерпретований рядковий буквенс:

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

Ви не можете безпосередньо поставити зворотну пропозицію (`) в сирному буквальному рядку (` `xx \ ).
Ви повинні використовувати (як описано в " як поставити зворотну копію у зворотному ланцюжку копій? "):

 + "`" + ...
25
додано

Використовуйте сирі рядкові літери для багаторядкових рядків:

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

Нерозумні літерали

Нерозумні літерали are character sequences between back quotes, as in foo. Within the quotes, any character may appear except back quote.

Значна частина полягає в тому, що це сирий буквальний, а не просто багаторядковий, і для цього не є єдиною метою створення багатоканальної лінії.

Значення необробленого буквеному рядку - це рядок, що складається з символів неперекладених (імпліцитно кодованих 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)
}

Конкатенація

Possibly you have long line which you want to break and you don't need new lines in it. Than you could use string Конкатенація.

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
}
16
додано

Ви можете помістити вміст "навколо нього", як

var hi = `I am here,
hello,
`
4
додано

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)
}
3
додано
IT KPI Go
IT KPI Go
59 учасників