Golang text / tabwriter не работает со строками. Builder как вывод io.Writer при использовании '\ t' - PullRequest
0 голосов
/ 20 января 2020

Проблема, которую я пытаюсь решить

Мне нужно отобразить некоторые данные пользователю в отформатированном виде (какая-то таблица в моем случае). Поэтому я использую text/tabwriter пакет в качестве простой опции. Я попытался вывести отформатированные строки в string.Builder для дальнейшего преобразования в простой тип строки. (os.Stdout не вариант в моем случае).

Сложности, с которыми я столкнулся

Когда я использую strings.Builder в качестве аргумента output (тип io.Writer) в Функция tabwriter.NewWriter() фактически ничего не выводит (см. Пример кода в разделе ниже). Эта проблема не появляется, когда я использую os.Stdout или любой другой файл в качестве вывода.

Что я пытался сделать

У меня есть тестовая структура, которая представляет некоторые данные, которые мне нужны на вывод:

type someData struct {
    FieldOne string
    FieldTwo string
}

Функция, которая форматирует эти данные и возвращает строку:

func formatData(data []someData) string {
    var builder strings.Builder

    writer := tabwriter.NewWriter(&builder, 0, 0, 3, ' ', 0)
    defer writer.Flush()

    for _, d := range data {
        fmt.Fprintln(writer, d.FieldOne+"\t"+d.FieldTwo)
    }
    return builder.String()
}

Вызов функции с тестовыми данными:

data := []someData{
    someData{
        FieldOne: "sample",
        FieldTwo: "data",
    },
    someData{
        FieldOne: "something",
        FieldTwo: "here",
    },
}

fmt.Println(formatData(data))

Этот код доступен на Go Playground .

Но когда я использую os.Stdout в качестве выхода, он работает нормально. Рабочий код также доступен на Go Playground .

Также проблема не появляется, если я не использую '\t' в строке для табрайтера.

( Этот: fmt.Fprintln(writer, d.FieldOne+"\t"+d.FieldTwo))

Пример с '.' вместо '\t' также доступен. Детская площадка Go


Заранее благодарим за любую помощь.

...