You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))
		}
	}
}

关键说明

  1. Ctrl+D检测:用户输入时按下Ctrl+D,reader.ReadString会返回io.EOF错误,捕获该错误即可触发数据处理。
  2. 多行输入处理:如果输入行以\结尾,自动读取下一行并拼接,保留换行格式。
  3. 跨平台兼容:完全基于Go标准库,无需第三方依赖,支持Windows、Linux、macOS等主流平台。
  4. 体验优化:多行输入时显示continue>提示,明确告知用户可继续输入内容。

为什么不用term-box/tcell?

这类库是为全屏终端应用设计的,专注于单个按键事件捕获,但会接管终端输入流,无法直接获取用户输入的文本内容。对于需要标准输入提示+文本输入的场景,标准库bufio是更轻量、适配性更强的选择。

内容的提问来源于stack exchange,提问作者Mack Trivedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:20:33