1 回答

TA貢獻1803條經驗 獲得超6個贊
首先我不會改變緩沖區。0
將前 16 個字符附加到其末尾以輕松獲得“滾動”效果是一個好主意,但是當您到達末尾時將位置重置到更容易且更便宜。
接下來,您不需要對字節切片進行操作。只需在string
.?字符串可以像切片一樣進行索引和切片,并且切片 astring
甚至不會進行復制(不必),它會返回一個新字符串(標頭),該字符串共享字符串數據的后備數組。不要忘記索引和切片string
使用字節索引(不是rune
索引),這對于 ASCII 文本來說很好(它們的字符在 UTF-8 中一對一映射到字節),但不適用于多字節特殊字符。你的示例文本很好。
也不要用于fmt.Printf()
打印需要格式的文本string
(將其第一個參數視為格式字符串)。相反,只需使用fmt.Print()
.
總而言之,您的解決方案可以簡化為這樣,這在性能方面要好得多,而且更干凈、更簡單:
func main() {
? ? fmt.Print("\033[2J") // clear screen
? ? s := text + text[:chars]
? ? for i := 0; ; i = (i + 1) % len(text) {
? ? ? ? fmt.Print("\033[H") // move cursor back to first position
? ? ? ? fmt.Print(s[i : i+chars])
? ? ? ? time.Sleep(time.Second / 2)
? ? }
}
另請注意,當位置達到 時len(text),我們將其重置為0,因此之前的文本從最后一個字符開始text并chars-1從頭開始使用。因此,附加chars-1而不是chars:
s := text + text[:chars-1]
- 1 回答
- 0 關注
- 138 瀏覽
添加回答
舉報