
本文介绍在 windows 系统中使用 go 语言安全、可靠地获取当前终端窗口的字符宽度(列数)与高度(行数),重点解决 `termbox-go` 初始化遗漏导致返回 `0 0` 的常见问题,并提供完整可运行示例与注意事项。
在 Windows 平台上,Go 标准库本身不直接提供跨平台的终端尺寸查询接口(如 Unix 系统下的 ioctl(TIOCGWINSZ)),因此需依赖第三方库。其中 github.com/nsf/termbox-go 是一个成熟、轻量且 Windows 兼容性良好的选择——但其核心约束常被忽略:必须显式调用 termbox.Init() 完成底层终端驱动初始化后,才能正确读取尺寸;否则 termbox.Size() 恒返回 (0, 0)。
以下是正确用法的完整示例:
package main
import (
"fmt"
"log"
"github.com/nsf/termbox-go"
)
func main() {
// 必须先初始化 termbox
if err := termbox.Init(); err != nil {
log.Fatal("无法初始化 termbox:", err)
}
defer termbox.Close() // 确保退出前释放资源
width, height := termbox.Size()
fmt.Printf("终端宽度:%d 字符,高度:%d 行\n", width, height)
}✅ 关键要点说明:
- termbox.Init() 不仅建立与控制台的连接,还触发内部状态同步(如 Windows 下调用 GetConsoleScreenBufferInfo);
- defer termbox.Close() 是最佳实践,避免资源泄漏(尤其在异常退出时);
- 该方案在 Windows 10/11 命令提示符(cmd)、PowerShell 及 Windows Terminal 中均稳定工作;
- 注意:termbox-go 已归档(archived),但截至 Go 1.22 仍完全可用;若追求活跃维护,可考虑替代方案如 golang.org/x/term(Go 1.21+ 引入),但其 GetSize() 仅支持 Unix 系统,Windows 下暂不可用。
⚠️ 常见误区提醒:
- 直接调用 termbox.Size() 而未初始化 → 返回 (0, 0),无错误提示;
- 忘记调用 termbox.Close() → 可能导致终端光标隐藏、输入缓冲异常等副作用;
- 在 goroutine 中并发调用 termbox.* 函数 → termbox-go 非并发安全,应确保单线程访问或加锁。
综上,对于 Windows 环境下需要精确终端尺寸的 CLI 工具开发,termbox-go 仍是当前最实用、兼容性最优的方案——只需牢记“先初始化,再读取,最后关闭”三步原则即可稳健运行。










