我试图在命令行上模仿 16 个字符的显示,它在一个长字符串上循环,无限类似于股票交易股票。
现在,我首先打印 ASCII 字符串的前 16 字节切片,并一次移动 1 个字节:
package main
import (
"fmt"
"time"
)
const (
chars = 16
text = "There are many variations of passages of Lorem Ipsum available!!!"
)
func main() {
fmt.Print("\033[2J") // clear screen
buf := []byte(text)
i := chars
for {
fmt.Print("\033[H") // move cursor back to first position
fmt.Printf(string(buf[i-chars : i]))
i++
if i == len(buf)+1 {
i = chars
}
time.Sleep(time.Second / 4)
// visualization of what's happening:
// fmt.Printf("\t\t Character:%d of Length:%d | Slice: %d:%d \n", i, len(buf), i-chars, i)
}
}
当我到达文本末尾时,我重置循环内的计数器并从第一个切片开始再次打印。我不想这样做,而是想获得“翻转”效果,其中切片的头部无缝连接到切片的尾部。
问题是,我不能使用空缓冲区并将头部附加到循环内的尾部,因为它会无限增长。
因此,我没有这样做,而是决定在循环之前将字符串的前 16 个字节附加到其尾部,并立即缩小切片 -16 个字节。但由于 -16 字节仍然存在于支持数组中,我可以从循环中扩展/收缩:
func main() {
fmt.Print("\033[2J") // clear screen
buf := []byte(text)
buf = append(buf, buf[:chars]...)
buf = buf[:len(buf)-chars]
var expanded bool
i := chars
for {
fmt.Print("\033[H") // move cursor back to first position
fmt.Printf(string(buf[i-chars : i]))
i++
if i+1 == len(buf)-chars && !expanded {
buf = buf[:len(buf)+chars]
expanded = true
}
if i+1 == len(buf) {
i = chars
buf = buf[:len(buf)-chars]
expanded = false
}
time.Sleep(time.Second / 2)
// visualization of what's happening:
//fmt.Printf("\t\t Character:%d of Length:%d | Slice: %d:%d | Cap: %d\n", i, len(buf), i-chars, i, cap(buf))
}
}
这让我到达了我想要的地方,但我对 Go 相当陌生,所以我想知道是否有更好的方法来达到相同的结果?
慕码人8056858
相关分类