Полное руководство по основам языка Zig

Это подробное руководство по основам языка Zig, включающее примеры программ, которые демонстрируют различные концепции программирования на Zig.

Назад

Первая программа на Zig

Каждая программа на Zig начинается с функции main:


const std = @import("std");

pub fn main() !void {
    std.debug.print("Hello, World!\n", .{});
}
        

Типы данных

Основные типы данных в Zig:

Арифметические операции

Пример использования арифметических операций в Zig:


const std = @import("std");

pub fn main() !void {
    const a = 10;
    const b = 20;
    const sum = a + b;
    const diff = b - a;
    const prod = a * b;
    const div = b / a;
    const mod = b % a;

    std.debug.print("Sum: {}\n", .{sum});
    std.debug.print("Difference: {}\n", .{diff});
    std.debug.print("Product: {}\n", .{prod});
    std.debug.print("Division: {}\n", .{div});
    std.debug.print("Modulus: {}\n", .{mod});
}
        

Ввод/Вывод

Ввод и вывод данных с использованием std.io:


const std = @import("std");

pub fn main() !void {
    const stdin = std.io.stdin().reader();
    const stdout = std.io.stdout().writer();

    try stdout.print("Enter an integer: ");
    var num: i32 = undefined;
    try stdin.readInt(&num);
    try stdout.print("You entered: {}\n", .{num});
}
        

Условные операторы

Пример использования оператора if:


const std = @import("std");

pub fn main() !void {
    const stdin = std.io.stdin().reader();
    const stdout = std.io.stdout().writer();

    try stdout.print("Enter an integer: ");
    var num: i32 = undefined;
    try stdin.readInt(&num);

    if (num > 0) {
        try stdout.print("The number is positive.\n", .{});
    } else if (num < 0) {
        try stdout.print("The number is negative.\n", .{});
    } else {
        try stdout.print("The number is zero.\n", .{});
    }
}
        

Циклы

Пример цикла for:


const std = @import("std");

pub fn main() !void {
    for (0..5) |i| {
        std.debug.print("i = {}\n", .{i});
    }
}
        

Массивы

Пример работы с массивами:


const std = @import("std");

pub fn main() !void {
    const arr = [_]i32{1, 2, 3, 4, 5};
    for (arr) |item, i| {
        std.debug.print("arr[{}] = {}\n", .{i, item});
    }
}
        

Функции

Пример создания и использования функции:


const std = @import("std");

fn greet() void {
    std.debug.print("Hello from the function!\n", .{});
}

pub fn main() !void {
    greet();
}
        

Классы и объекты

В Zig нет классов как таковых, но можно использовать структуры:


const std = @import("std");

const Rectangle = struct {
    width: f64,
    height: f64,

    pub fn area(self: Rectangle) f64 {
        return self.width * self.height;
    },

    pub fn display(self: Rectangle) void {
        std.debug.print("Width: {}, Height: {}, Area: {}\n", .{self.width, self.height, self.area()});
    }
};

pub fn main() !void {
    var rect = Rectangle{ .width = 5.0, .height = 3.0 };
    rect.display();
}
        

Наследование

В Zig нет классического наследования, но можно использовать композицию:


const std = @import("std");

const Animal = struct {
    pub fn speak(self: Animal) void {
        std.debug.print("Animal makes a sound.\n", .{});
    }
};

const Dog = struct {
    animal: Animal,

    pub fn speak(self: Dog) void {
        std.debug.print("Dog barks.\n", .{});
    }
};

pub fn main() !void {
    var my_dog = Dog{ .animal = Animal{} };
    my_dog.speak();
}
        

Указатели

Пример работы с указателями:


const std = @import("std");

pub fn main() !void {
    var num: i32 = 10;
    var ptr = #

    std.debug.print("Value of num: {}\n", .{num});
    std.debug.print("Value via pointer: {}\n", .{ptr.*});

    ptr.* = 20;
    std.debug.print("New value of num: {}\n", .{num});
}
        

Динамическое выделение памяти

Пример динамического выделения и освобождения памяти:


const std = @import("std");

pub fn main() !void {
    var allocator = std.heap.page_allocator;
    var ptr = try allocator.create(i32);
    ptr.* = 10;

    std.debug.print("Value: {}\n", .{ptr.*});

    allocator.destroy(ptr);
}
        

Работа с файлами

Пример работы с файлами в Zig:


const std = @import("std");

pub fn main() !void {
    const allocator = std.heap.page_allocator;
    const out_file = try std.fs.cwd().createFile("example.txt", .{});
    try out_file.writer().print("Hello, file!\n", .{});

    const in_file = try std.fs.cwd().openFile("example.txt", .{});
    const file_content = try in_file.readToEndAlloc(allocator);
    std.debug.print("{}\n", .{file_content});
}