首页 > 解决方案 > golang io.writer 写完字符串后换行

问题描述

我有以下代码使用来绘制进度条

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

所有作品,除了最后没有新行,你可以在这里看到 在此处输入图像描述

我无法在 Write 函数中添加换行符,因为这将导致它在每个字节被推送到写入器后换行。有没有一种巧妙的方法可以做到这一点?

编辑:我想要在进度条之后和下一行打印出来之前的新行

标签: gonewlinewriter

解决方案


您所问问题的简单答案是在进度条完成后打印一个额外的换行符:

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
}

尽管您的评论表明这是有问题的,但您还没有解释如何。如果您更新您的问题以解释为什么这是一个问题,也许可以找到更好的解决方案。


推荐阅读