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 关注
- 107 浏览
添加回答
举报