Go语言跨平台CLI应用:输入时集成Ctrl+D键盘事件方案
解决Go CLI跨平台兼容:同时支持输入提示与Ctrl+D触发处理
要实现既支持标准文本输入(包括多行),又能通过Ctrl+D直接触发处理的功能,不需要依赖第三方键盘事件库,用Go标准库就能搞定。核心思路是利用终端中Ctrl+D会触发EOF信号的特性,结合bufio.Reader捕获这个信号,同时处理多行输入逻辑。
实现方案
替换原代码中的读取逻辑,改为循环读取输入行并捕获EOF错误:
package main import ( "bufio" "fmt" "io" "os" "strings" ) func getProcessedData(input string) string { // 替换为你的实际数据处理逻辑 return fmt.Sprintf("processed: %q", input) } func main() { reader := bufio.NewReader(os.Stdin) fmt.Println("# Please press CTRL+D to process data") for { fmt.Print("\nyour-input> ") var input strings.Builder var eofTriggered bool for { line, err := reader.ReadString('\n') if err != nil { if err == io.EOF { eofTriggered = true break } fmt.Printf("\nError reading input: %v\n", err) input.Reset() break } // 处理多行输入:行尾带\则继续读取下一行 if strings.HasSuffix(line, "\\\n") { line = strings.TrimSuffix(line, "\\\n") + "\n" input.WriteString(line) fmt.Print(" continue> ") // 可选的多行输入提示 } else { input.WriteString(line) break } } text := strings.TrimSpace(input.String()) // 无论输入是否为空,触发Ctrl+D就执行处理 if eofTriggered || text != "" { fmt.Printf("\nresponse> %s\n", getProcessedData(text)) } } }
关键说明
- Ctrl+D检测:用户输入时按下Ctrl+D,
reader.ReadString会返回io.EOF错误,捕获该错误即可触发数据处理。 - 多行输入处理:如果输入行以
\结尾,自动读取下一行并拼接,保留换行格式。 - 跨平台兼容:完全基于Go标准库,无需第三方依赖,支持Windows、Linux、macOS等主流平台。
- 体验优化:多行输入时显示
continue>提示,明确告知用户可继续输入内容。
为什么不用term-box/tcell?
这类库是为全屏终端应用设计的,专注于单个按键事件捕获,但会接管终端输入流,无法直接获取用户输入的文本内容。对于需要标准输入提示+文本输入的场景,标准库bufio是更轻量、适配性更强的选择。
内容的提问来源于stack exchange,提问作者Mack Trivedi
相关产品推荐
相关产品推荐

