как разделить длинные строки для fmt.sprintf

У меня очень длинная очередь в fmt.Sprintf. Как мне разделить это в коде? Я не хочу помещать все в одну строку, чтобы код выглядел некрасиво.

fmt.Sprintf("a:%s, b:%s  ...... this goes really long")

person WhatABeautifulWorld    schedule 01.02.2016    source источник


Ответы (5)


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

 fmt.Sprintf("a:%s, b:%s " +
    " ...... this goes really long",
    s1, s2)

Длинная строка в этом примере строится во время компиляции, поскольку конкатенация строк является постоянным выражением.

Вы можете разбить строку на содержащиеся символы новой строки, используя необработанный строковый литерал:

     fmt.Sprintf(`this text is on the first line
and this text is on the second line,
and third`)
person Cerise Limón    schedule 01.02.2016

Вы также можете использовать необработанные строковые литералы внутри обратных кавычек, например:

columns := "id, name"
table := "users"
query := fmt.Sprintf(`
    SELECT %s
    FROM %s
  `, columns, table)
fmt.Println(query)

В этом подходе есть несколько предостережений:

  1. Необработанные строки не анализируют escape-последовательности
  2. Все пробелы будут сохранены, поэтому в этом запросе будет новая строка, а затем несколько вкладок перед предложением FROM.

Эти проблемы могут быть проблемой для некоторых, а пробелы приведут к уродливым результирующим строкам. Тем не менее, я предпочитаю этот подход, поскольку он позволяет копировать и вставлять длинные сложные SQL-запросы вне вашего кода и в другие контексты, такие как листы SQL для тестирования.

person Kyle Heuton    schedule 04.04.2018

Поскольку вы уже используете Sprintf (это означает, что у вас будет строка типа «это строка с %s заполнителями в ней»), вы можете просто добавить в строку больше заполнителей, а затем поместить туда нужные значения. их собственные линии, как;

fmt.Sprintf("This %s is so long that I need %s%s%s for the other three strings,
"string",
"some super long statement that I don't want to type on 50 lines",
"another one of those",
"yet another one of those")

Другой вариант — просто использовать конкатенацию строк, например "string 1" + "string 2".

person evanmcdonnal    schedule 01.02.2016
comment
Похоже, было бы лучше объединить строки, чтобы длинная строка строилась во время компиляции, а не во время выполнения, как это было бы сделано выше. (Если это как-то не оптимизировано.) - person Andy Schweig; 02.02.2016
comment
@AndySchweig Я не уверен, какие оптимизации делает компилятор Go, однако нет причин, по которым это нельзя было бы оптимизировать так же, как конкатенацию. Применяются те же правила: если все значения известны во время компиляции, то расчет может быть выполнен, если одно или несколько значений неизвестны до времени выполнения, то это невозможно. - person evanmcdonnal; 02.02.2016

Почему бы вам не разделить это:

fmt.Sprintf("a:%s, b:%s ", x1, x2)

fmt.Sprintf("...... ")

fmt.Sprintf("this goes really long")

Или вы можете разделить их с помощью знака плюс, как указано MuffinTop.

person Paulo    schedule 01.02.2016

Другой вариант strings.Builder:

package main

import (
   "fmt"
   "strings"
)

func main() {
   b := new(strings.Builder)
   fmt.Fprint(b, "North")
   fmt.Fprint(b, "South")
   println(b.String() == "NorthSouth")
}

https://golang.org/pkg/strings#Builder

person Steven Penny    schedule 16.04.2021