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

使用io.WriteString调用Stockfish时可执行程序提前退出问题

异常产生原因
  • 所有UCI协议(Stockfish遵循的国际象棋引擎通信协议)指令都以换行符作为执行触发标记,你传入的go depth 20指令末尾没有换行符,Stockfish识别不到指令输入完成,不会启动完整的深度20计算流程,在你关闭stdin后直接返回当前低深度计算得到的最优走法,所以耗时极短。
  • 你传入的position指令中存在拼写错误,exmaplepos不是合法的位置标识,Stockfish无法读取到正确的待计算棋局,也会触发默认的快速返回逻辑。
修复方案
  1. 统一处理指令换行:在写入每条指令时自动追加换行符,避免上层调用漏写的问题,同时使用bufio包装标准输入管道,手动刷入缓冲确保指令实时发送到Stockfish进程。
  2. 修正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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:54:01