golang io.writer новая строка после завершения записи строки - PullRequest
0 голосов
/ 25 июня 2019

У меня есть следующий код, который использует пакет для рисования индикатора выполнения

type tmpStruct struct {
}

func (t *tmpStruct) Write(p []byte) (n int, err error) {
    fmt.Fprintf(os.Stdout, "%s", string(p))
    return len(p), nil
}

func demoLoadingBarCount(maximumInt int) {
    buf := tmpStruct{}
    if nBuf, ok := interface{}(&buf).(io.Writer); ok {
        bar := progressbar.NewOptions(
            maximumInt,
            progressbar.OptionSetTheme(progressbar.Theme{Saucer: "█", SaucerPadding: "-", BarStart: ">", BarEnd: "<"}),
            progressbar.OptionSetWidth(100),
            progressbar.OptionSetWriter(nBuf),
        )
        for i := 0; i < maximumInt; i++ {
            bar.Add(1)
            time.Sleep(10 * time.Millisecond)
        }
    }
}

Все работает, кроме новой строки в конце, как вы можете видеть здесь enter image description here

Я не могу добавить символ новой строки в функцию Write, поскольку это приведет к его появлению на новой строке после каждого байта, переданного в устройство записи.Есть ли способ сделать это аккуратно?

РЕДАКТИРОВАТЬ: я хочу новую строку после индикатор выполнения и до того, как следующая строка печатает

1 Ответ

3 голосов
/ 25 июня 2019

Простой ответ на вопрос, который вы задали, - просто напечатать дополнительную строку после завершения индикатора выполнения:

func demoLoadingBarCount(maximumInt int) {
    buf := &tmpStruct{}
    bar := progressbar.NewOptions(
        maximumInt,
        progressbar.OptionSetTheme(progressbar.Theme{Saucer: "█", SaucerPadding: "-", BarStart: ">", BarEnd: "<"}),
        progressbar.OptionSetWidth(100),
        progressbar.OptionSetWriter(buf),
    )
    for i := 0; i < maximumInt; i++ {
        bar.Add(1)
        time.Sleep(10 * time.Millisecond)
    }
    fmt.Fprintf(buf, "\n") // <---- Add this
}

Хотя ваши комментарии указывают на то, что это проблематично, но вы не объяснили, как это сделать. Если вы обновите свой вопрос, чтобы объяснить, почему это проблема, возможно, последует лучшее решение.

...