Golang新手入门,求轻喷 :D

Golang新手入门,求轻喷 :D 我需要从控制台读取用户输入。听起来很简单,但我需要在用户不按"Enter"键的情况下获取输入。这应该是可行的。请帮帮我。

7 回复

很遗憾,这个方法行不通

更多关于Golang新手入门,求轻喷 :D的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


请告诉我你是否成功了!我很想学习。

好的,非常感谢。我现在就试试这个方法。

我通过一个名为“keyboard”的库解决了这个问题。(github.com/eiannone/keyboard

大多数情况下,当提到键盘时,您指的是标准输入。您可以通过此处“读取单个UTF-8编码的Unicode字符”章节中介绍的方法,避免使用第三方库。

其核心思路是使用Reader从标准输入中读取字符。

祝您有美好的一天。

@Tigran_Kashapov 欢迎加入社区!

虽然我还没有尝试过从终端向Go程序传输数据,但稍作搜索后找到了下面的链接。希望能提供更多帮助,但希望这至少能为你解决问题指明正确方向。

图片

Go语言中的流式IO

在Go语言中,输入和输出操作是通过将数据建模为可读写字节流的原语来实现的…

阅读时间:7分钟

在Go中,标准库的bufioos包通常用于从控制台读取输入,但默认情况下需要用户按"Enter"键。要实现不按"Enter"键直接获取输入(例如单个字符),需要使用系统特定的终端处理方式。在Unix-like系统(如Linux或macOS)上,可以通过修改终端模式来实现;Windows系统则需要使用不同的方法。

以下是一个适用于Unix-like系统的示例,使用term包来处理终端原始模式。首先,你需要安装golang.org/x/term包(如果尚未安装,运行go get golang.org/x/term)。

package main

import (
    "fmt"
    "golang.org/x/term"
    "os"
    "syscall"
    "unsafe"
)

func main() {
    // 保存当前终端状态,以便恢复
    oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
    if err != nil {
        fmt.Println("Error setting terminal to raw mode:", err)
        return
    }
    defer term.Restore(int(os.Stdin.Fd()), oldState) // 确保程序退出前恢复终端

    fmt.Print("请输入一个字符(无需按Enter键):")
    
    // 读取单个字节(字符)
    var buf [1]byte
    n, err := os.Stdin.Read(buf[:])
    if err != nil {
        fmt.Println("Error reading input:", err)
        return
    }
    
    if n > 0 {
        fmt.Printf("\n你输入的字符是: %c\n", buf[0])
    } else {
        fmt.Println("没有输入任何字符。")
    }
}

这个代码将终端设置为原始模式,允许立即读取输入而无需等待"Enter"键。注意,这仅在Unix-like系统上有效。对于Windows系统,你需要使用syscall或其他特定包(如github.com/eiannone/keyboard)来处理控制台输入。

如果你需要在Windows上实现类似功能,可以考虑使用第三方库如keyboard。例如,安装keyboard包(运行go get github.com/eiannone/keyboard),然后使用以下代码:

package main

import (
    "fmt"
    "github.com/eiannone/keyboard"
)

func main() {
    if err := keyboard.Open(); err != nil {
        fmt.Println("Error opening keyboard:", err)
        return
    }
    defer keyboard.Close()

    fmt.Print("请输入一个字符(无需按Enter键):")
    char, key, err := keyboard.GetKey()
    if err != nil {
        fmt.Println("Error reading key:", err)
        return
    }
    
    if key == keyboard.KeyEsc || key == keyboard.KeyCtrlC {
        fmt.Println("\n退出。")
        return
    }
    
    fmt.Printf("\n你输入的字符是: %c\n", char)
}

这些示例展示了如何在Go中实现不按"Enter"键读取输入。根据你的操作系统选择合适的方法。

回到顶部