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

是否存在不显示输入内容的Go语言用户输入函数?支持Konami代码式检测

Go语言实现无回显输入并监测按键组合

Go标准库没有直接提供这类函数,但可以通过终端控制包结合自定义逻辑实现。核心思路是将终端切换为原始模式(关闭输入回显、捕获单个按键),同时维护一个按键缓冲区记录最近操作,实时匹配目标组合。

实现步骤与代码示例

我们可以使用golang.org/x/term包处理终端模式,同时编写逻辑捕获按键、维护序列并匹配Konami Code(上↑、上↑、下↓、下↓、左←、右→、左←、右→、B、A)。

package main

import (
	"bufio"
	"fmt"
	"os"
	"os/signal"
	"syscall"

	"golang.org/x/term"
)

// 定义Konami Code的按键序列,用自定义常量表示特殊按键
const (
	keyUp    = "\x1b[A"
	keyDown  = "\x1b[B"
	keyLeft  = "\x1b[D"
	keyRight = "\x1b[C"
	keyB     = "b"
	keyA     = "a"
)

var konamiSequence = []string{keyUp, keyUp, keyDown, keyDown, keyLeft, keyRight, keyLeft, keyRight, keyB, keyA}

func main() {
	// 保存原始终端状态,确保退出时恢复
	oldState, err := term.MakeRaw(int(os.Stdin.Fd()))
	if err != nil {
		fmt.Fprintf(os.Stderr, "无法设置终端模式: %v\n", err)
		os.Exit(1)
	}
	defer term.Restore(int(os.Stdin.Fd()), oldState)

	// 处理中断信号,确保终端恢复
	sigChan := make(chan os.Signal, 1)
	signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
	go func() {
		<-sigChan
		term.Restore(int(os.Stdin.Fd()), oldState)
		os.Exit(0)
	}()

	fmt.Println("请输入Konami Code(无回显),输入Ctrl+C退出...")

	// 按键缓冲区,长度等于目标序列长度
	keyBuffer := make([]string, 0, len(konamiSequence))
	reader := bufio.NewReader(os.Stdin)

	for {
		// 读取单个字节,判断是否是特殊按键的起始符ESC
		b, err := reader.ReadByte()
		if err != nil {
			fmt.Fprintf(os.Stderr, "读取输入失败: %v\n", err)
			break
		}

		var key string
		if b == '\x1b' {
			// 特殊按键(方向键)是ESC开头的3字节序列,读取剩余两个字节
			rest := make([]byte, 2)
			_, err := reader.Read(rest)
			if err != nil {
				continue
			}
			key = string(append([]byte{b}, rest...))
		} else {
			// 普通字符按键,转小写统一匹配
			if b >= 'A' && b <= 'Z' {
				b += 32
			}
			key = string(b)
		}

		// 更新缓冲区:如果已满,移除最早的按键
		if len(keyBuffer) == cap(keyBuffer) {
			keyBuffer = keyBuffer[1:]
		}
		keyBuffer = append(keyBuffer, key)

		// 匹配目标序列
		if len(keyBuffer) == len(konamiSequence) {
			match := true
			for i := range konamiSequence {
				if keyBuffer[i] != konamiSequence[i] {
					match = false
					break
				}
			}
			if match {
				fmt.Println("\nKonami Code 触发成功!")
				// 可以在这里添加触发后的逻辑
				break
			}
		}
	}
}

关键细节说明

  • 终端模式控制:term.MakeRaw将终端切换为原始模式,关闭输入回显并允许捕获单个按键;defer确保程序退出时恢复终端状态,避免终端陷入异常。
  • 特殊按键处理:方向键等控制键以ESC(\x1b)开头,需要读取后续字节来识别完整按键序列。
  • 序列匹配逻辑:用固定长度的缓冲区保存最近按键,每次新按键加入时移除最早的记录,当缓冲区长度等于目标序列时,逐位对比是否匹配。
  • 信号处理:监听中断信号(Ctrl+C),确保收到信号时先恢复终端再退出,避免终端异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:40:45