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

时间:2017-10-25 14:06:31

标签: 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
}

你可以抓住uilive:

go get github.com/gosuri/uilive

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

go build && ./diskusage "/Users/clint/Music"

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

enter image description here

这就像我预期的那样,输出在同一行上:

enter image description here

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

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

有人有什么想法吗?

1 个答案:

答案 0 :(得分:6)

该包状态的文档

  

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

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

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