刚接触 Zig 时,只是想试一下怎么遍历数组、搞懂 const 和 var 的区别,或者测一小段错误处理逻辑?如果非得先去下载工具链、配环境、建文件,确实有些折腾。对于这种 “代码没两行、就想马上看结果” 的情况,在线环境显然更省事。
咱们绿叶网的 Zig 在线编译器就是为你量身定做的。打开网页直接写代码,一键运行看结果。不管是新手入门边学边试,还是熟悉 C、C++ 或 Rust 的小伙伴想快速体验 Zig 的手感,都非常合适。
页面上方就是咱们的 Zig 在线编译器:左边写代码,右边看结果。操作起来非常直观,轻松就能上手。
Ctrl + Enter 快捷键。我们来跑个简单例子:统计一组数字里有几个偶数,并算出它们的总和。这个例子一口气用到了数组、const(常量)、var(变量)、for 循环和条件判断,非常适合第一次接触 Zig 时拿来练手。
const std = @import("std");
pub fn main() void {
const numbers = [_]u32{ 12, 7, 18, 5, 20 };
var count: usize = 0;
var total: u32 = 0;
for (numbers) |number| {
if (number % 2 == 0) {
count += 1;
total += number;
}
}
std.debug.print("偶数数量:{d}\n", .{count});
std.debug.print("偶数之和:{d}\n", .{total});
}运行结果如下。
偶数数量:3
偶数之和:50像上面这种小代码,最适合使用在线编译器来验证。写完直接运行,不需要专门去建个本地项目。
Zig 在线编译器更适合小段代码、快速验证和语法学习。它最大的价值不是替代完整的本地开发环境,而是让你在不折腾环境的情况下,先把语言本身跑起来。常见场景包括:

简单来说,Zig 是一门主打 “系统级编程” 的底层语言。人们常拿它和 C、C++、Rust 放在一起比较,因为它同样死磕性能和内存控制。
比起 C 语言,Zig 并不是简单地给语法化个妆、加点现代功能。它骨子里非常强调 “直白(显式)”:它没有复杂的预处理器和传统宏,也没有暗中执行的代码逻辑。在 Zig 里,只要发生内存分配、函数调用或错误传递,我们都能从源码上看得清清楚楚。
这种 “所见即所得” 的风格,对于喜欢把控程序运行细节的开发者来说非常有吸引力。不过,这也意味着初学时需要花点心思去理解它的类型、内存和错误处理机制。

虽然 Zig 也能写普通的业务逻辑,但它真正的看家本领还是在底层和性能敏感的场景。比较常见的用途包括:

Zig 和 C 的关系非常铁,但它们并不是 “同一种语言”。
Zig 可以直接引入 C 语言的头文件,老旧的 C 库往往能轻松接入 Zig 项目中。但 Zig 并没有全盘照搬 C 的设计,比如它砍掉了预处理器宏,加入了切片(Slice)、安全的错误处理和编译期执行等现代功能,希望能帮开发者少踩些 C 语言容易引发内存安全的 “坑”。
更有意思的是,Zig 不仅是一门语言,它本身还自带了一套强大的 C/C++ 编译器(比如 zig cc)。所以很多就算不写 Zig 代码的开发者,也会用 Zig 工具链来编译传统的 C/C++ 项目。

这是 Zig 新手小伙伴很快就会遇到的问题。简单来说,const 表示这个变量绑定在初始化之后不会再改变;如果确实需要修改,就使用 var。
const std = @import("std");
pub fn main() void {
const name = "Zig";
var count: u32 = 1;
count += 1;
std.debug.print("{s}: {d}\n", .{ name, count });
}这里 name 从头到尾都不会重新赋值,所以使用 const;count 后面执行了 count += 1,因此必须使用 var。Zig 编译器甚至会提醒你:如果某个局部变量声明为 var 却从未真正修改,应该考虑改成 const。
这种要求刚开始可能显得有点 “较真”,但好处也很直接:看到 const 就知道这个绑定不会变化,阅读代码时少猜一件事。
Zig 没有使用传统的 try...catch 异常机制来处理普通错误,而是把错误作为类型的一部分。你经常会看到 !T 这样的返回类型,它表示函数要么返回一个 T 类型的值,要么返回一个错误。
const std = @import("std");
fn divide(a: u32, b: u32) !u32 {
if (b == 0) {
return error.DivideByZero;
}
return a / b;
}
pub fn main() !void {
const result = try divide(20, 4);
std.debug.print("结果:{d}\n", .{result});
}这里 divide() 的返回类型是 !u32,表示可能得到 u32,也可能得到错误。try 会检查调用结果:如果成功,就取出里面的值继续执行;如果是错误,则把这个错误从当前函数继续返回。
这种写法把 “这个函数可能失败” 直接写进类型里,调用者也必须明确决定怎么处理。对于文件、网络、解析等容易失败的操作,这种错误处理方式很常见。
代码写得多了以后,鼠标点来点去多少有点慢。Zig 在线编译器支持下面这些常用快捷键,小伙伴们先把几个高频的记住就够用了。
Ctrl + Enter:运行代码。Ctrl + Z:撤销、Ctrl + Y:重做。Ctrl + C:复制、Ctrl + V:粘贴。Ctrl + A:全选。Ctrl + X:剪切。Ctrl + /:注释或取消注释。Ctrl + Home:跳转到首行的行首。Ctrl + End:跳转到末行的结尾。其中最值得记住的还是 Ctrl + Enter。刚把 var 改成 const、补了一个 try,或者调整完循环条件,顺手运行一次,很快就能知道当前代码是否符合预期。