Golang新手入门,求轻喷 :D
Golang新手入门,求轻喷 :D 我需要从控制台读取用户输入。听起来很简单,但我需要在用户不按"Enter"键的情况下获取输入。这应该是可行的。请帮帮我。
请告诉我你是否成功了!我很想学习。
好的,非常感谢。我现在就试试这个方法。
我通过一个名为“keyboard”的库解决了这个问题。(github.com/eiannone/keyboard)
大多数情况下,当提到键盘时,您指的是标准输入。您可以通过此处“读取单个UTF-8编码的Unicode字符”章节中介绍的方法,避免使用第三方库。
其核心思路是使用Reader从标准输入中读取字符。
祝您有美好的一天。
嗨 @Tigran_Kashapov 欢迎加入社区!
虽然我还没有尝试过从终端向Go程序传输数据,但稍作搜索后找到了下面的链接。希望能提供更多帮助,但希望这至少能为你解决问题指明正确方向。

Go语言中的流式IO
在Go语言中,输入和输出操作是通过将数据建模为可读写字节流的原语来实现的…
阅读时间:7分钟
在Go中,标准库的bufio和os包通常用于从控制台读取输入,但默认情况下需要用户按"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"键读取输入。根据你的操作系统选择合适的方法。

