Go 在围棋中我该怎么做?

Go 在围棋中我该怎么做?,go,Go,如何在Go中执行“光标向上”操作?(清楚到行尾也很好知道)。(所有平台) 为了详细说明和显示上下文,我正在用Go编写一个测试程序,它需要输入一些参数(通过控制台),这些参数存储在一个文本文件中,并用作下一次使用的默认值。我想要一些非常基本的控制台“编辑”功能 目前它相当原始,因为我不想深入到控制台编辑中,我只想要一些相当基本但也不太基本的东西 在下面的测试程序示例中,字符串变量“sPrompt”包含输入提示,右边显示默认值,然后有退格字符定位光标,这样默认值就不会被覆盖——就像我说的,非常基本

如何在Go中执行“光标向上”操作?(清楚到行尾也很好知道)。(所有平台)

为了详细说明和显示上下文,我正在用Go编写一个测试程序,它需要输入一些参数(通过控制台),这些参数存储在一个文本文件中,并用作下一次使用的默认值。我想要一些非常基本的控制台“编辑”功能

目前它相当原始,因为我不想深入到控制台编辑中,我只想要一些相当基本但也不太基本的东西

在下面的测试程序示例中,字符串变量“sPrompt”包含输入提示,右边显示默认值,然后有退格字符定位光标,这样默认值就不会被覆盖——就像我说的,非常基本

当操作员输入时,如果出现错误,我希望显示一条错误消息,然后在任何一种情况下,将光标向上移动到刚刚显示/输入的行,如果出现错误,则显示原始行,或者如果正确,仅显示提示和新参数

我确实在某个地方读到应该避免使用ReadLine(),但它似乎起到了作用

例如:

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
      恢复光标位置
    然后在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;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源代码中。