使用io.WriteString调用Stockfish时可执行程序提前退出问题
异常产生原因
- 所有UCI协议(Stockfish遵循的国际象棋引擎通信协议)指令都以换行符作为执行触发标记,你传入的
go depth 20指令末尾没有换行符,Stockfish识别不到指令输入完成,不会启动完整的深度20计算流程,在你关闭stdin后直接返回当前低深度计算得到的最优走法,所以耗时极短。 - 你传入的position指令中存在拼写错误,
exmaplepos不是合法的位置标识,Stockfish无法读取到正确的待计算棋局,也会触发默认的快速返回逻辑。
修复方案
- 统一处理指令换行:在写入每条指令时自动追加换行符,避免上层调用漏写的问题,同时使用bufio包装标准输入管道,手动刷入缓冲确保指令实时发送到Stockfish进程。
- 修正position指令的拼写错误,保证棋局位置参数合法。
修正后代码示例
import "bufio" func useStockfish(commands []string) string { cmd := exec.Command("stockfish") stdin, err := cmd.StdinPipe() if err != nil { log.Fatal(err) } // 用bufio包装stdin,方便控制缓冲 writer := bufio.NewWriter(stdin) for _, cmdStr := range commands { writeString(cmdStr, writer) } // 刷入所有待写内容,确保指令全部发送到引擎 err = writer.Flush() if err != nil { log.Fatal(err) } err = stdin.Close() if err != nil { log.Fatal(err) } // 等待引擎计算完成返回所有输出 out, err := cmd.CombinedOutput() if err != nil { log.Fatal(err) } return string(out) } // 自动给每条指令追加换行符,上层调用无需手动添加 func writeString(cmdStr string, writer *bufio.Writer) { _, err := writer.WriteString(cmdStr + "\n") if err != nil { log.Fatal(err) } }
修正后调用代码
func FetchComputerMove(game *internal.Game) { // 修正position拼写错误,无需手动加换行 useStockfish([]string{"position examplepos", "go depth 20"}) }
内容的提问来源于stack exchange,提问作者Robert
相关产品推荐
相关产品推荐

