Go 在围棋中我该怎么做?
如何在Go中执行“光标向上”操作?(清楚到行尾也很好知道)。(所有平台) 为了详细说明和显示上下文,我正在用Go编写一个测试程序,它需要输入一些参数(通过控制台),这些参数存储在一个文本文件中,并用作下一次使用的默认值。我想要一些非常基本的控制台“编辑”功能 目前它相当原始,因为我不想深入到控制台编辑中,我只想要一些相当基本但也不太基本的东西 在下面的测试程序示例中,字符串变量“sPrompt”包含输入提示,右边显示默认值,然后有退格字符定位光标,这样默认值就不会被覆盖——就像我说的,非常基本 当操作员输入时,如果出现错误,我希望显示一条错误消息,然后在任何一种情况下,将光标向上移动到刚刚显示/输入的行,如果出现错误,则显示原始行,或者如果正确,仅显示提示和新参数 我确实在某个地方读到应该避免使用ReadLine(),但它似乎起到了作用 例如:Go 在围棋中我该怎么做?,go,Go,如何在Go中执行“光标向上”操作?(清楚到行尾也很好知道)。(所有平台) 为了详细说明和显示上下文,我正在用Go编写一个测试程序,它需要输入一些参数(通过控制台),这些参数存储在一个文本文件中,并用作下一次使用的默认值。我想要一些非常基本的控制台“编辑”功能 目前它相当原始,因为我不想深入到控制台编辑中,我只想要一些相当基本但也不太基本的东西 在下面的测试程序示例中,字符串变量“sPrompt”包含输入提示,右边显示默认值,然后有退格字符定位光标,这样默认值就不会被覆盖——就像我说的,非常基本
func fInputString(sPrompt string, asValid []string, sDefault string)
(sInput string, tEnd bool) {
oBufReader := bufio.NewReader(os.Stdin)
for {
print("\n" + sPrompt)
vLine, _, _ := oBufReader.ReadLine()
sInput = strings.ToLower(string(vLine))
if sInput == "end" {
return "", true
}
if sInput == "" {
sInput = sDefault
}
// check for valid input //
for _, sVal := range asValid {
if sInput == sVal {
return sInput, false
}
}
}
}
这就是sPrompt的构造方式(不是要优化):
如果发生故障!="" {
对于len(sPrompt)<67{
sPrompt+=“”
}
sPrompt+=sDefault
对于iBack:=20+len(sDefault);iBack>0;iBack--{
sPrompt+=“\b”
}
}
制作自己的小外壳
你不应该重新发明轮子,使用一个完全符合你需要的库。
一个流行的选项是适用于Windows的
也例如,bash和ZSH使用了这一点。有一些围棋包装:
我个人会推荐,因为它有更好的文档记录
并且有更好的API(不像C)。似乎没有一个特殊的构建标签
Windows,所以您可能需要自己编写,但这应该没有那么难
@bgp已经指出,它的(纯)Go实现确实有利于简单地阅读一行,因为它似乎更具意图
用于全屏控制台应用程序。此外,还必须对上/下匹配进行编码
还有你自己的历史
.Readline()
医生说得对,你不应该使用它,因为它不会为你处理任何事情
你。例如,从发出部分数据的流中读取数据时,不能保证从Readline
获得完整的行。使用它。制作你自己的小外壳
你不应该重新发明轮子,使用一个完全符合你需要的库。
一个流行的选项是适用于Windows的
也例如,bash和ZSH使用了这一点。有一些围棋包装:
我个人会推荐,因为它有更好的文档记录
并且有更好的API(不像C)。似乎没有一个特殊的构建标签
Windows,所以您可能需要自己编写,但这应该没有那么难
@bgp已经指出,它的(纯)Go实现确实有利于简单地阅读一行,因为它似乎更具意图
用于全屏控制台应用程序。此外,还必须对上/下匹配进行编码
还有你自己的历史
.Readline()
医生说得对,你不应该使用它,因为它不会为你处理任何事情
你。例如,从发出部分数据的流中读取数据时,不能保证从Readline
获得完整的行。用于此操作。带有控制屏幕上光标的字符串:
保存光标位置tput sc
恢复光标位置tput rc
package main
import (
"fmt"
"time"
)
const sc = "\u001B7"
const rc = "\u001B8"
func main() {
fmt.Print(sc)
for i := 1; i <= 10; i++ {
fmt.Print(rc + sc)
fmt.Println(i, "one")
fmt.Println(i, "two")
fmt.Println(i, "three")
fmt.Println(i, "four")
fmt.Println(i, "five")
time.Sleep(time.Second)
}
}
主程序包
进口(
“fmt”
“时间”
)
常量sc=“\u001B7”
常量rc=“\u001B8”
func main(){
格式打印(sc)
对于i:=1;i以及控制屏幕上光标的字符串:
tput sc
保存光标位置
tput rc
恢复光标位置
然后在Go函数中使用这些字符串:
package main
import (
"fmt"
"time"
)
const sc = "\u001B7"
const rc = "\u001B8"
func main() {
fmt.Print(sc)
for i := 1; i <= 10; i++ {
fmt.Print(rc + sc)
fmt.Println(i, "one")
fmt.Println(i, "two")
fmt.Println(i, "three")
fmt.Println(i, "four")
fmt.Println(i, "five")
time.Sleep(time.Second)
}
}
主程序包
进口(
“fmt”
“时间”
)
常量sc=“\u001B7”
常量rc=“\u001B8”
func main(){
格式打印(sc)
对于i:=1;我看这是否有帮助:看这是否有帮助:对于macOS bash,可以使用tput xx | pbcopy
捕获每个字符串,然后粘贴到Go源代码中。对于macOS bash,可以使用tput xx | pbcopy
捕获每个字符串,然后粘贴到Go源代码中。