Як ви пишете багаторядкові рядки в Go?


Відповіді:


973

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

`line 1
line 2
line 3`

176
Як бічна примітка: "Сира цитата", як її називають, не розбирає послідовності втечі. Саме тому рядковий літерал вибору записує регулярні шаблони виразів, оскільки вони зазвичай містять нестандартні послідовності виходу, що змусить компілятор Go скаржитися на не подвійне уникнення. Він зберігає візерунки чистими та відносно читабельними.
jimt

10
Потрібно бути обережними з цим при використанні пробілів кінцевої лінії. Наприклад, якщо ви помістите пробіл після line 1того, як він буде невидимий у вашому редакторі, але присутній у рядку.
Ory Band

2
@DanieleD Це незначний не наступний текст, але який діалект? Імовірно переважно MySQL? stackoverflow.com/a/10574031 Зауважте, що після розширення того ж аргументу це біль для вбудовування розмітки або скриптів оболонки (якщо ви вирішите використовувати замість цього backtick $(abcd)).
Іван Вучиця

8
@KyleHeuton: Імовірно, Daniele D використовує символ backtick у своїх SQL-запитах (як це часто роблять користувачі MySQL), і вважає болісним представляти його як "+" "" + "та порушувати копіюваність та пропускність.
ruakh

1
Суть до цього полягає в тому, що якщо ви пишете його всередині відступного коду, вкладки будуть включені в рядок, і щоб позбутися від них, ваш код буде виглядати некрасиво. За таких обставин я вважаю за краще скористатися відповіддю Азема
Загублений Кротчет

111

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

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

що те саме, що:

"line 1line 2line3"

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

"line 1"
+"line 2"

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


32
Це рішення не є аналогом багаторядкових рядків Python. Він розбиває літеральний рядок на кілька рядків, але сам рядок не містить декількох рядків.
Бен Батлер-Коул

2
Оскільки це дозволяє зберегти символи втечі, нові рядки можна просто додати \nта набагато простіше працювати з динамічними рядками та ін. Якщо я маю рацію, прийнята відповідь дійсно полягає у статичних рядках у коді, щоб вони виглядали красиво.
RisingSun

1
Чи не буде це також неефективно? Нехай у рядку буде 3x 6 символьна послідовність: 6 + 2 * 6 + 3 * 6 = 36 знаків, виділених, коли оптимальним було б 18 (оскільки рядки незмінні, щоразу, коли ви додаєте два рядки, створюється нова рядок довжиною два рядки з'єднані).
N0thing

@ N0thing: якщо є лише рядкові літерали, відмінностей у виконанні немає, оскільки компілятор оптимізує. Але є невелика (мікросекунда або навіть наносекунда) різниця у часі компіляції.
долмен

Я вважаю, що це найкращий спосіб отримати багаторядковий літеральний рядок із закінченнями рядка CRLF
ldanilek

39

З рядкових літералів :

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

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

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

Ви не можете безпосередньо поставити backquote (`) в необроблений рядковий літерал (` `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

Перехід і багаторядкові рядки

За допомогою зворотних кліщів ви можете мати багаторядкові рядки:

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

Ви повинні бути дуже обережними у форматуванні та міжрядковому інтервалі в ході, все враховується, і ось робочий зразок, спробуйте 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.
             `
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.