Как напечатать отформатированную строку на той же строке в стандартный вывод с Go? - PullRequest
3 голосов
/ 13 мая 2019

Я перебираю массив и печатаю отформатированную строку с каждым элементом массива в терминал (стандартный вывод).Вместо того, чтобы печатать каждый элемент на новой строке, я хочу перезаписать предыдущий вывод самым новым выводом программы.

Я использую 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").

1 Ответ

0 голосов
/ 13 мая 2019

Вы можете использовать ANSI Escape-коды

Сначала сохраните позицию курсора с помощью 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
    ...
}

Опять же, это работает, пока ваша линия соответствует ширине экрана / окна.

...