这是我的代码:
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"
这就是它的样子(在多行上输出):
这就像我预期的那样,输出在同一行上:
uilive.Writer代码看起来像是线程安全的: https://github.com/gosuri/uilive/blob/master/writer.go
我不明白为什么它只能写入一行时输出多行。
有人有什么想法吗?
答案 0 :(得分:6)
该包状态的文档
[uilive]提供了一个以定时间隔刷新的缓冲io.Writer。
您只是写入比刷新输出缓冲区更快。如果希望在每次写入后刷新缓冲区,请在每次写入后调用Flush()
。
fmt.Fprintf(writer, "Size: %f GB\n", size/(kb*kb*kb))
writer.Flush()