我正在遍历一个数组,并将每个数组元素的格式化字符串打印到终端(stdout)。而不是在新行上打印每个元素,我想用程序的最新输出覆盖以前的输出。
我正在使用macosx。
我尝试了几种方法:
// 'f' is the current element of the array
b := bytes.NewBufferString("")
if err != nil {
fmt.Printf("\rCould not retrieve file info for %s\n", f)
b.Reset()
} else {
fmt.Printf("\rRetrieved %s\n", f)
b.Reset()
}
第二种方法是从字符串中删除\r
,并在每个输出之前添加和附加Printf:fmt.Printf("\033[0;0H")
。
答案 0 :(得分:0)
您可以使用ANSI Escape Codes
首先,使用fmt.Print("\033[s")
保存光标的位置,然后对于每一行,恢复位置并清除行,然后再使用fmt.Print("\033[u\033[K")
打印行
您的代码可能是:
// before entering the loop
fmt.Print("\033[s") // save the cursor position
for ... {
...
fmt.Print("\033[u\033[K") // restore the cursor position and clear the line
if err != nil {
fmt.Printf("Could not retrieve file info for %s\n", f)
} else {
fmt.Printf("Retrieved %s\n", f)
}
...
}
它应该起作用,除非您的程序在屏幕底部打印该行,从而产生文本滚动。在这种情况下,您应该删除\n
,并确保没有任何一行超出屏幕(或窗口)的宽度。
另一种选择是在每次写入后将光标向上移动:
for ... {
...
fmt.Print("\033[G\033[K") // move the cursor left and clear the line
if err != nil {
fmt.Printf("Could not retrieve file info for %s\n", f)
} else {
fmt.Printf("Retrieved %s\n", f)
}
fmt.Print("\033[A") // move the cursor up
...
}
同样,只要您的线条适合屏幕/窗口宽度,此方法就起作用。