【免费下载链接】gooeyGooey is a hybrid immediate/retained mode UI framework designed for building fast, GPU-rendered applications on macOS/Metal, WebAssembly/WebGPU, and Wayland/Vulkan项目地址https://gitcode.com/gh_mirrors/gooey3/gooey点击查看免费下载Gooey 是一个用 Zig 编写的 GPU 渲染 UI 框架支持 macOS/Metal、WebAssembly/WebGPU 与 Wayland/Vulkan 三端。本文将带你用官方 Todo 示例完成一次完整实战用声明式 UI描述界面结构用纯状态模式组织业务逻辑并学会为状态编写不依赖任何 UI 的单元测试。无论你是 Zig 新手还是想体验高性能桌面 UI 的开发者这篇指南都能让你在 10 分钟内跑通一个功能齐全的 Todo 应用。为什么 Todo 应用是最好的实战入口Gooey 的官方 Todo 示例src/examples/todo.zig被设计为 API 的切片演示一个文件里覆盖了框架的核心能力纯状态模型AppState完全不知道 UI 的存在可独立测试声明式布局ui.root/ui.hstack/ui.box等原语组合出 Flexbox 风格布局双向绑定TextInput通过.bind与状态中的draft字段实时同步事件处理器cx.update/cx.updateWith把用户操作映射到纯状态方法保留模式控件Checkbox、Button、TextInput来自 components/ 组件包Gooey 的能力不止于 Todo 清单——下图是用它构建的 AI 聊天客户端 chat-zig展示了深色主题、自定义控件与 GPU 渲染的实际效果快速上手三步跑通官方 Todo 示例环境要求Zig 0.17.0。Gooey 零外部 Zig 包依赖只需链接系统框架/库。第 1 步获取仓库git clone https://gitcode.com/gh_mirrors/gooey3/gooey第 2 步运行 Todo 示例构建目标定义在 build.zig执行zig build run-todo第 3 步体验功能你会看到一个 480×560 的窗口包含输入框 Add 按钮、All / Active / Done 三个筛选按钮、带复选框与 Delete 按钮的任务列表、底部剩余数量 清除已完成栏。完整命令列表见 readme.md。纯状态模式先设计 AppState再碰任何 UIGooey 最核心的设计理念是状态与界面彻底分离。Todo 的状态模型src/examples/todo.zig长这样const AppState struct { todos: [MAX_TODOS]Todo splat(.{}), count: usize 0, draft: []const u8 , // 双向绑定到 TextInput filter: Filter .all, fn pushTodo(self: *AppState, value: []const u8) void { /* 去空白、限长、限容 */ } pub fn toggle(self: *AppState, index: usize) void { /* 翻转完成状态 */ } pub fn remove(self: *AppState, index: usize) void { /* 移除并保持列表连续 */ } pub fn clearCompleted(self: *AppState) void { /* 批量清除已完成 */ } };几个值得注意的工程细节设计点做法收益内存固定容量数组最多 64 条文本用内联buf缓冲区运行期零分配无生命周期耦合边界防御每个方法自带越界/容量检查如 toggle调用方无需预判出错静默降级纯逻辑所有方法不出现Cx、Window等 UI 类型状态可脱离 UI 单测这就是纯状态模式的价值业务逻辑是一段可以被测试直接驱动的纯代码而不是散落在事件回调里的碎片。声明式 UI用 ui.* 原语描述界面声明式 UI 的含义是你只声明界面在给定状态下应该长什么样框架负责在状态变化时重绘。Todo 的render函数src/examples/todo.zig结构非常直观fn render(cx: *Cx) void { cx.render(ui.root(.{ .direction .column, .padding .{ .all 24 }, .gap 16 }, .{ ui.text(Todos, .{ .size 28 }), InputRow{}, // 输入框 Add 按钮 FilterBar{}, // All / Active / Done TodoList{}, // 列表或空状态提示 ui.spacer(), Footer{}, // 剩余数量 清除已完成 })); }声明式布局的常用原语完整定义在 src/ui/ui.root/ui.box— Flexbox 布局容器可设背景色、圆角、主/交叉轴对齐ui.hstack/ui.vstack— 横向/纵向堆叠只带间距与对齐ui.text/ui.textFmt— 文本与格式化文本ui.when/ui.maybe— 条件渲染ui.spacer— 弹性占位一个典型的高亮细节是任务行组件TodoRowsrc/examples/todo.zig需要背景色 垂直居中所以用ui.box(.{ .direction .row, ... })而不是hstack文字颜色则由状态推导——完成的项显示灰色未完成的显示黑色。界面永远是状态的同构映射这正是声明式 UI 的精髓。事件处理cx.update 与 cx.updateWith 两件套Gooey 用Cx上下文管理状态、事件与焦点src/context/用ui.*只做布局。所有用户交互都通过处理器连接回纯状态方法方法签名适用场景cx.update()fn(*State) void无参变更如addTodo、clearCompletedcx.updateWith()fn(*State, Arg) void带参变更如删除第 index 行cx.command()fn(*State, *Window) void需要框架能力焦点、退出、实体Todo 里的两处典型用法// 无参点击 Add 后调用纯状态方法 Button{ .label Add, .on_click_handler cx.update(AppState.addTodo) } // 带参把行索引打包进处理器点击时回传 Checkbox{ .selected self.done, .on_click_handler cx.updateWith(self.index, AppState.toggle) }⚠️ 小提示updateWith的参数会被打包进 8 字节的u64存储所以适合传索引、指针、小枚举如Filter不要传大结构体。完整处理器说明见 readme.md。零 UI 单元测试纯状态模式的直接红利因为AppState不认识 UI测试可以完全在没有窗口、没有渲染的环境里运行src/examples/todo.zigtest remove keeps the list contiguous { var s AppState{}; s.pushTodo(a); s.pushTodo(b); s.pushTodo(c); s.remove(1); // 删掉 b try std.testing.expectEqual(as(usize, 2), s.count); try std.testing.expectEqualStrings(a, s.todos[0].text()); try std.testing.expectEqualStrings(c, s.todos[1].text()); }官方共写了 6 组测试覆盖去空白/空输入忽略、容量上限、越界安全、删除连续性、剩余计数与筛选可见性。执行zig build test这类测试在 CI 上无需显示器、无需 GPU 驱动是纯状态模式最实际的投资回报。小结与下一步回到本文的核心主线声明式 UI 让界面成为状态的函数纯状态模式让逻辑成为可测试的纯代码两者共同构成了 Gooey 的应用开发范式。一个 400 行出头的文件就跑通了完整闭环源码就在 src/examples/todo.zig值得逐行精读。跑通 Todo 之后推荐按这条路线继续深入组件包components/ 提供Button、Modal、Select、Tooltip等开箱即用控件图表charts/ 提供 GPU 加速的折线、柱状、饼图官方文档readme.md 覆盖主题、字体、动画、拖放、无障碍等全部特性更多示例src/examples/ 下有 Pomodoro 番茄钟、虚拟列表1 万行、代码编辑器等实战参考赞分享【免费下载链接】gooeyGooey is a hybrid immediate/retained mode UI framework designed for building fast, GPU-rendered applications on macOS/Metal, WebAssembly/WebGPU, and Wayland/Vulkan项目地址https://gitcode.com/gh_mirrors/gooey3/gooey点击查看免费下载相关推荐ESP-IDF v6.0技术架构革新重塑物联网安全与性能新范式ESP IDF v6.0技术架构革新重塑物联网安全与性能新范式 ESP IDF v6.0作为乐鑫物联网开发框架的重大版本更新标志着ESP32生态在2026年物联网嵌入式驱动开发系统编程企业级可视化图表架构设计Mermaid代码驱动图表解决方案技术解析企业级可视化图表架构设计Mermaid代码驱动图表解决方案技术解析 Mermaid作为一款革命性的代码驱动图表工具通过Markdown风格语法为技术团队提供前端数据可视化图表库Flet 声明式迁移实战用 ft.component、ft.observable 与状态 Hook 将命令式应用重构为 Components 模式Flet 声明式迁移实战用 ft.component、ft.observable 与状态 Hook 将命令式应用重构为 Components 模式 Fle前端跨平台上一篇苹果触控板 Windows 驱动免费开源方案从安装到手势调优下一篇IPATool IPA下载实战教程3条命令拿到App Store应用的IPA包创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Krokiet|免费的本地重复文件清理工具,第一次清盘先点哪里 Krokiet|免费的本地重复文件清理工具,第一次清盘先点哪里 【免费下载链接】czkawka Multi functional app to find duplicates, empty folders, similar images etc. 项目地址: https://gitcode.com/GitHub_Trending/cz/czkawka
Krokiet 是 czkaw… · 2026/11/4 2:03:03
Hermes Agent容器镜像安全:四步构建可信部署 Hermes Agent容器镜像安全:四步构建可信部署
Hermes Agent容器镜像上线半年,某天基础镜像被静默更新,会话数据开始出怪。这类风险的源头往往不在应用代码,而在基础镜像的选择与更新机制上。
风险全景
基础镜像用 latest 或裸版… · 2026/11/4 2:03:03
零安装本地AI运行工具:KoboldCpp让大模型在你电脑上开箱即用 零安装本地AI运行工具:KoboldCpp让大模型在你电脑上开箱即用 【免费下载链接】koboldcpp KoboldCpp - Run GGUF AI models locally with a KoboldAI UI. One File. Zero Install. 项目地址: https://gitcode.com/gh_mirrors/ko/koboldcpp
KoboldCpp 是一款免… · 2026/11/4 2:02:03
高效学习日记:提升知识留存与认知迭代的实践指南 1. 项目概述"学习日记(2026年3月26日)"这个标题看似简单,实际上蕴含着一个高效学习者的完整知识管理体系。作为一名坚持写学习日记7年的实践者,我发现这种记录方式远比普通笔记更能提升学习效果。2026年3月26日这天的学… · 2026/11/4 2:54:20
智能汽车安全威胁全景:从API滥用、AI投毒到跨域攻击 1. 智能汽车与泛终端安全威胁全景解析作为一名在汽车电子安全领域摸爬滚打十年的老兵,我亲眼见证了车载系统代码量从百万行激增到上亿行的过程。记得2016年参与某德系品牌ECU开发时,我们还在为CAN总线加密算法争得面红耳赤,如今却要面对整车数… · 2026/11/4 2:54:20
软考数据库系统工程师复习:三层知识地图与易漏点清单 简介:面向软考数据库系统工程师考试的复习资料完全版,适合备考中级资格的在职开发者与计算机专业学生系统梳理考点。全书以单一 docx 文档整合十五章内容,压缩包约 2.93MB、共 1 个文件,按章节顺序编排,并附页码目录&a… · 2026/11/4 2:54:20
MySQL数据查询实验训练2:六类SQL查询骨架与避坑 简介:这份PDF实验指导书对应国家开放大学MySQL数据库应用课程实验训练2,聚焦数据查询操作,适合正在学习SQL基础、需要按实验步骤完成课堂练习与课后复盘的初学者。内容围绕字段查询、多条件筛选、DISTINCT去重、ORDER BY排序、GROUP BY分组及… · 2026/11/4 2:54:20
2026实时录音转文字工具实测与优化指南 1. 录音转文字技术现状与需求分析2026年的实时录音转文字市场已经进入成熟期,各类工具在准确率、响应速度和成本控制方面都有了显著提升。作为长期关注语音技术发展的从业者,我最近对市面上主流的7款工具进行了为期3个月的深度测试,发现不同工… · 2026/11/4 2:54:20
MySQL复合查询实战:从基础到高级优化 1. 复合查询基础概念解析MySQL中的复合查询是指通过组合多个简单查询语句构建更复杂的数据检索操作。这种查询方式在实际业务场景中极为常见,特别是当我们需要从多个维度分析数据或处理关联性较强的数据集时。复合查询的核心价值在于它能够:合并多个查询… · 2026/11/4 2:53:20
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46
AI辅助技术栈评估:提升研发决策效率60% 1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17
从生成Token到直接决策:Jev如何重塑AI Agent工程实践 1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17
32G统一内存跑大模型:内存账、TPS实测与端云分流 想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/2 13:10:28
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 6:04:24
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/3 5:52:46