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

Есть ли в Go что-нибудь похожее на многострочные строки Python:

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

Если нет, то какой способ записи строк занимает несколько строк?

Ответ 1

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

`line 1
line 2
line 3`

Ответ 2

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

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

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

"line 1line 2line3"

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

"line 1"
+"line 2"

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

Ответ 3

Из строковых литералов:

  • Необработанный строковый литерал поддерживает многострочный (но экранированные символы не интерпретируются)
  • интерпретируемый строковый литерал интерпретирует экранированные символы, например ' \n '.

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

'line one
  line two ' +
"'" + 'line three
line four'

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

 + "'" + ...

Ответ 4

Используйте необработанные строковые литералы для многострочных строк:

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
}

Ответ 5

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

Вместо использования символов двойной кавычки (") или одинарных кавычек ('), вместо этого используйте обратные галочки, чтобы определить начало и конец строки. Затем можно обернуть ее между строками.

Если вы сделаете отступ в строке, помните, что пробел будет учитываться.

Пожалуйста, проверьте игровую площадку и проведите эксперименты с ней.

Ответ 6

Вы можете поместить содержимое с `` вокруг него, например

var hi = `I am here,
hello,
`

Ответ 7

Вы должны быть очень осторожны при форматировании и межстрочном интервалах в 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)
}

Ответ 8

Вы можете использовать сырые литералы. пример

s:='stack
overflow'

Ответ 9

Для меня это то, что я использую, если добавление \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.
             '

Ответ 10

sql := 'SELECT a.id, COALESCE(a.user_id) as user_id, COALESCE(u.username) as username, COALESCE(a.category_id) as category_id,
COALESCE(ca.label) AS category_label, COALESCE(ca.name) AS category_name, COALESCE(a.name) AS advertiser_name,
COALESCE(a.domain) as domain, COALESCE(a.click_through_url) as click_through_url, COALESCE(a.icon_url) as icon_url,
COALESCE(a.created_at) as created_at, COALESCE(a.status) as status, count(c.id) as campaign_count
FROM advertisers a 
INNER JOIN users u ON (u.id = a.user_id AND u.id = %v AND u.status = 1) 
INNER JOIN categories_iab ca ON (ca.id = a.category_id AND ca.status = 1)
LEFT JOIN campaigns c ON a.id = c.advertiser_id
GROUP BY a.id'

text := fmt.Sprintf("CALL paginator(\"%s\", %d, %d, \"detailed\")", sql, 4, 5)

fmt.Println(text)

Я получаю следующее

CALL paginator ("ВЫБЕРИТЕ a.id, COALESCE (a.user_id) в качестве user_id, COALESCE (u.username) в качестве имени пользователя, COALESCE (a.category_id) в качестве category_id, COALESCE (ca.label) в качестве category_label, COALESCE (ca.name") ) AS category_name, COALESCE (a.name) AS рекламодателя_name, COALE SCE (a.domain) в качестве домена, COALESCE (a.click_through_url) в качестве click_through_url, COALESCE (a.icon_url) в качестве icon_url, COALESCE (a.created_at) в качестве созданного_at, COALESCE (a.status) в качестве статуса, считать (c.id) как кампания_count ОТ рекламодателей ВНУТРЕННИХ РЕЙТИНГОВ пользователей u ВКЛ (u.id = a.user_id AND u.id =% v AND u.status = 1) ВНУТРЕННЕЕ СОЕДИНЕНИЕ ca ON (ca.id = a.category_id AND ca.status = 1) ЛЕВЫЕ ПРИСОЕДИНЯЕТСЯ Кампании c ON a.id = c.advertiser_id GROUP BY a.id ", 4, 5," подробный ")

КЛЮЧЕВОЕ СЛОВО разбито на 2 строки!