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

如何用Go语言gizak/termui包创建可填充字符的8×8网格?

使用gizak/termui创建8×8网格的可行方案

你的代码触发panic的核心原因是ui.NewRow和ui.NewCol的参数类型不符合要求:这两个方法需要接收termui官方Widget类型作为内容载体,而非普通字符串;同时NewRow的第二个参数需要传入列的集合(多个Col对象或Col切片)。

以下是修正后的完整可行代码:

package main

import (
    "github.com/gizak/termui/v3"
    "github.com/gizak/termui/v3/widgets"
)

func main() {
    // 初始化termui终端UI
    if err := termui.Init(); err != nil {
        panic(err)
    }
    defer termui.Close()

    screenWidth, screenHeight := termui.TerminalDimensions()

    // 创建网格并设置其在终端中的位置
    grid := termui.NewGrid()
    grid.SetRect(screenWidth/2-30, screenHeight/2-8, screenWidth/2+30, screenHeight/2+8)

    var rows []interface{}
    // 构建8行
    for i := 0; i < 8; i++ {
        var cols []interface{}
        // 每行构建8列
        for j := 0; j < 8; j++ {
            // 创建Paragraph组件作为单元格,用于显示任意字符
            cell := widgets.NewParagraph()
            cell.Text = "-" // 初始填充字符,后续可修改为任意内容
            cell.Border = true // 显示边框,清晰区分单元格
            // 每个列占网格宽度的1/8
            cols = append(cols, termui.NewCol(1.0/8, cell))
        }
        // 每行占网格高度的1/8,传入该行的所有列
        rows = append(rows, termui.NewRow(1.0/8, cols...))
    }

    // 将构建好的行集合设置到网格中
    grid.Set(rows...)

    // 渲染网格到终端
    termui.Render(grid)

    // 监听退出事件(按q或Ctrl+C退出)
    for e := range termui.PollEvents() {
        if e.ID == "q" || e.ID == "<C-c>" {
            break
        }
    }
}

关键修正说明

  • 用widgets.NewParagraph()创建单元格:这是termui支持的标准Widget,能承载文本内容,符合grid组件的类型要求
  • 修正NewCol参数:传入Paragraph实例而非字符串,确保类型匹配
  • 修正NewRow参数:用cols...展开列切片,传入完整的列集合,而非单个无效字符串
  • 可选的边框设置:cell.Border = true让网格结构更直观,可根据需求移除

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 05:22:23