Как вы пишете многострочные строки в Go?


Ответы:


974

В соответствии со спецификацией языка вы можете использовать необработанный строковый литерал, где строка отделяется обратными кавычками вместо двойных кавычек.

`line 1
line 2
line 3`

176
В качестве примечания: «Необработанная цитата», как она называется, не анализирует escape-последовательности. Поэтому строковый литерал предпочтителен для написания шаблонов регулярных выражений, поскольку они обычно содержат нестандартные escape-последовательности, которые заставили бы компилятор Go жаловаться на то, что он не был дважды экранирован. Он сохраняет шаблоны чистыми и относительно читаемыми.
Джимт

10
Нужно быть осторожным с этим при использовании конечных пробелов. Например, если вы поставите пробел после line 1того, как он будет невидимым в вашем редакторе, но присутствует в строке.
Ory Band

2
@DanieleD Это небольшое несоответствие, но какой диалект? Предположительно в основном MySQL? stackoverflow.com/a/10574031 Обратите внимание, что из-за расширения одного и того же аргумента сложно внедрить уценку или сценарии оболочки (если вы решите использовать backtick вместо $(abcd)).
Иван Вучица,

8
@KyleHeuton: Предположительно, Даниэль D использует символ обратного течения в своих SQL-запросах (как это часто делают пользователи MySQL) и считает болезненным необходимость представлять его как `+" `" + `и нарушать возможность копирования и вставки.
Руах

1
Обратной стороной этого является то, что если вы пишете его внутри кода с отступом, вкладки будут включены в строку, и избавление от них сделает ваш код уродливым. При таких обстоятельствах я предпочел бы использовать ответ Азима
Lost Crotchet

112

Ты можешь написать:

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

что так же, как:

"line 1line 2line3"

В отличие от использования обратных тиков, он сохранит escape-символы. Обратите внимание, что «+» должен быть в «ведущей» строке, то есть:

"line 1"
+"line 2"

генерирует ошибку.


32
Это решение не аналогично многострочным строкам Python. Он разбивает строковый литерал на несколько строк, но сама строка не содержит нескольких строк.
Бен Батлер-Коул

2
Поскольку это сохраняет escape-символы, новые строки могут быть просто добавлены, \nи намного проще работать с динамическими строками и тому подобным. Если я прав, принятый ответ действительно для статических строк в коде, чтобы он выглядел красиво.
RisingSun

1
Разве это не будет очень неэффективно? Пусть строка будет 3x последовательность из 6 символов: 6 + 2 * 6 + 3 * 6 = 36 символов, выделенных, когда оптимальным будет 18 (поскольку строки неизменяемы, каждый раз, когда вы добавляете две строки, создается новая строка с длиной двух соединенные строки).
ничего

@ N0thing: если есть только строковые литералы, нет различий во время выполнения, так как компилятор будет оптимизировать. Но есть небольшая (микросекунды или даже наносекунды) разница во времени компиляции.
дольмен

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