为什么我看到应该是单行编写器的多行标准输出?

Cli*_*ntm 1 go

这是我的代码:

package main

import (
    "fmt"
    "os"
    "path/filepath"

    "github.com/gosuri/uilive"
)

var writer = uilive.New()

const kb = 1024.00

func main() {
    writer.Start()
    // start listening for updates and render
    dirSize(os.Args[1])
    writer.Stop()
}

func dirSize(path string) (float64, error) {
    // todo check if path exists
    var size float64
    err := filepath.Walk(path, func(_ string, info os.FileInfo, err error) error {
        if !info.IsDir() {
            size += float64(info.Size())
            fmt.Fprintf(writer, "Size: %f GB\n", size/(kb*kb*kb))

        }
        return err
    })
    return size, err
}
Run Code Online (Sandbox Code Playgroud)

你可以抓住uilive:

go get github.com/gosuri/uilive
Run Code Online (Sandbox Code Playgroud)

代码在$ GOPATH/diskusage中.当我运行它时:

go build && ./diskusage "/Users/clint/Music"
Run Code Online (Sandbox Code Playgroud)

这是它的样子(在多行输出):

在此输入图像描述

这是我希望它看起来像在同一行上的输出:

在此输入图像描述

uilive.Writer代码看起来像是线程安全的:https: //github.com/gosuri/uilive/blob/master/writer.go

我不明白为什么它只能写入一行时输出多行.

有人有主意吗?

Jim*_*imB 6

该包的文档状态

[uilive]提供了一个以定时间隔刷新的缓冲io.Writer.

您只是写入比刷新输出缓冲区更快.如果希望在每次写入Flush()后刷新缓冲区,请在每次写入后调用.

fmt.Fprintf(writer, "Size: %f GB\n", size/(kb*kb*kb))
writer.Flush()
Run Code Online (Sandbox Code Playgroud)