Zig Cheatsheet

Created: 2021-03-18 Updated: 2022-08-04

Handy syntax reference for lizards of all ages.

I’m interested in help with improving this!

Also, check out this PR for a Zig edition of "Learn X in Y Minutes": https://github.com/adambard/learnxinyminutes-docs/pull/4293

const print = @import("std").debug.print;

pub fn main() !void {
    print("Hello {s}!\n", .{"world"});

    // Strings and string-like things
    const real: *const [3:0]u8 = "baz";  // pointer to null-terminated array
    const a: []const u8 = "foo";         // slice (pointer with length)
    const b: [*]const u8 = "bar";        // many-item pointer (unknown length!)
    const b2: []const u8 = b[0..3];      // ...cast to slice so it has a length
    const c = [3]u8{ 'f', 'o', 'o' };    // array
    const d = [_]u8{ 'b', 'a', 'r' };    // array with inferred size
    const e: [3]u8 = .{ 'b', 'a', 'z' }; // array from anonymous struct
    print("{s} {s} {s} {s} {s} {s}\n", .{real, a, b2, c, d, e});

    // Errors
    const ESet = error{ Bad, Worse };          // error set
    const darkness = error.DarknessAndDespair; // a single error
    var maybe_error: ESet!u8 = ESet.Bad;       // error union: error OR a u8
    var not_error: u8 = maybe_error catch 0; // catch error and replace with default
    print("not_error (default value): {}\n", .{not_error});
    maybe_error = 4; // not an error, or program will panic/halt for the following
    var definitely_not_error: u8 = maybe_error catch unreachable;
    var not_error_or_death: u8 = maybe_error catch |err| return err;
    var not_error_or_death2: u8 = try maybe_error; // shorthand for catch/return
    if (maybe_error) |good_value| { // capture non-error value
        print("maybe_error is NOT an error: {}\n", .{good_value});
    } else |err| switch (err) { // capture error value, switch on type
        ESet.Bad => {}, // handle bad error
        ESet.Worse => {}, // handle worse error
    errdefer print("This would print if main() returned with error.\n");
    // Optionals
    var maybe_null: ?u8 = null; // basically a "null union"
    if (maybe_null) print("it is null!", .{});
    var not_null: u8 = maybe_null orelse 4; // replace null with default value
    print("not_null (default value): {}\n", .{not_null});
    maybe_null = 5; // set to not null
    var better_not_be_null = maybe_null.?; // short for "maybe_null orelse unreachable"
    if (maybe_null) |never_null| {
        print("Capturing non-null value never_null: {}\n", .{never_null});
    } else {
        print("Was null\n", .{});

    // .... to be continued ....

Zig std.fmt.format():