Примеры кода на Go

Практические примеры кода для понимания концепций программирования на Go.

ОсновыСтруктуры данныхООППараллелизмОбработка ошибок

Привет, мир

Основы

Простая программа Hello World для начала работы с Go.

Go
package main

import "fmt"

func main() {
    fmt.Println("Привет, мир!")
}

💡 Объяснение

Это классическая первая программа. Она импортирует пакет fmt и использует Println для вывода текста.

Переменные и константы

Основы

Работа с различными типами переменных и констант в Go.

Go
package main

import "fmt"

func main() {
    // Объявление переменных
    var name string = "Программирование на Go"
    var version float64 = 1.21
    
    // Краткое объявление переменной
    isAwesome := true
    
    // Константы
    const pi = 3.14159
    
    fmt.Printf("Язык: %s\n", name)
    fmt.Printf("Версия: %.2f\n", version)
    fmt.Printf("Потрясающий: %t\n", isAwesome)
    fmt.Printf("Пи: %f\n", pi)
}

💡 Объяснение

Демонстрирует различные способы объявления переменных и констант, а также различные типы данных.

Операции со срезами

Структуры данных

Работа со срезами - динамическими массивами в Go.

Go
package main

import "fmt"

func main() {
    // Создание срезов
    numbers := []int{1, 2, 3, 4, 5}
    
    // Добавление в срез
    numbers = append(numbers, 6, 7, 8)
    
    // Получение подсреза
    subset := numbers[2:5]
    
    fmt.Println("Исходный срез:", numbers)
    fmt.Println("Подсрез [2:5]:", subset)
    fmt.Println("Длина:", len(numbers))
    fmt.Println("Ёмкость:", cap(numbers))
    
    // Итерация по срезу
    for i, value := range numbers {
        fmt.Printf("Индекс: %d, Значение: %d\n", i, value)
    }
}

💡 Объяснение

Показывает, как создавать, изменять и итерировать по срезам, которые являются одним из наиболее важных типов данных в Go.

Структуры и методы

ООП

Определение структур и методов для создания пользовательских типов.

Go
package main

import "fmt"

// Определение структуры
type Person struct {
    Name string
    Age  int
    City string
}

// Метод с приёмником по значению
func (p Person) Greet() string {
    return fmt.Sprintf("Привет, я %s из %s", p.Name, p.City)
}

// Метод с приёмником по указателю
func (p *Person) HaveBirthday() {
    p.Age++
}

func main() {
    // Создание экземпляра структуры
    person := Person{
        Name: "Алиса",
        Age:  25,
        City: "Москва",
    }
    
    fmt.Println(person.Greet())
    fmt.Printf("Возраст до дня рождения: %d\n", person.Age)
    
    person.HaveBirthday()
    fmt.Printf("Возраст после дня рождения: %d\n", person.Age)
}

💡 Объяснение

Демонстрирует, как определять структуры и прикреплять к ним методы, показывая приёмники по значению и по указателю.

Горутины и каналы

Параллелизм

Основы параллелизма с горутинами и каналами.

Go
package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for job := range jobs {
        fmt.Printf("Работник %d обрабатывает задание %d\n", id, job)
        time.Sleep(time.Second) // Имитация работы
        results <- job * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)
    
    // Запуск 3 работников
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }
    
    // Отправка 5 заданий
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)
    
    // Сбор результатов
    for r := 1; r <= 5; r++ {
        result := <-results
        fmt.Printf("Результат: %d\n", result)
    }
}

💡 Объяснение

Показывает, как использовать горутины для параллельного выполнения и каналы для коммуникации между ними.

Обработка ошибок

Обработка ошибок

Правильные паттерны обработки ошибок в Go.

Go
package main

import (
    "errors"
    "fmt"
)

func divide(a, b float64) (float64, error) {
    if b == 0 {
        return 0, errors.New("деление на ноль")
    }
    return a / b, nil
}

func main() {
    // Успешная операция
    result, err := divide(10, 2)
    if err != nil {
        fmt.Printf("Ошибка: %v\n", err)
    } else {
        fmt.Printf("10 / 2 = %.2f\n", result)
    }
    
    // Операция с ошибкой
    result, err = divide(10, 0)
    if err != nil {
        fmt.Printf("Ошибка: %v\n", err)
    } else {
        fmt.Printf("10 / 0 = %.2f\n", result)
    }
}

💡 Объяснение

Демонстрирует подход Go к обработке ошибок с использованием множественных возвращаемых значений и явной проверки ошибок.

Готовы попробовать эти примеры?

Скопируйте примеры кода и запустите их в Go Playground или в вашей локальной среде.