Основы языка Go

2. Основы языка Go #

2.1 Синтаксис и структура программы #

Программа на Go состоит из пакетов, файлов и функций. Главный пакет программы называется main, а функция main является точкой входа.

Пример минимальной программы:

package main

import "fmt" // Импорт стандартного пакета для вывода

func main() {
    fmt.Println("Привет, Go!") // Вывод сообщения
}

Ключевые элементы: #

  • Пакеты: Каждый файл начинается с объявления пакета (package main).
  • Импорты: Подключение внешних или стандартных библиотек через import.
  • Функции: Определяются с помощью ключевого слова func.

2.2 Типы данных #

Go — язык со строгой статической типизацией. Это означает, что тип каждой переменной определяется на этапе компиляции.

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

Числовые: #

  • Целые числа: int, int8, int16, int32, int64 (и их беззнаковые версии uint).
  • Вещественные числа: float32, float64.
  • Комплексные числа: complex64, complex128.

Пример:

var age int = 25
var pi float64 = 3.14
fmt.Println(age, pi)

Строки: #

Строки представлены типом string. Они неизменяемы и поддерживают операции срезов.

Пример:

str := "Hello, Go!"
fmt.Println(str[0])        // 72 (ASCII код символа 'H')
fmt.Println(str[:5])       // "Hello"
fmt.Println(len(str))      // 9

Булевы значения: #

Тип bool принимает только true или false.

Пример:

isEven := true
fmt.Println(isEven)

Составные типы: #

  • Массивы: Фиксированная длина.
  • Срезы: Динамические массивы.
  • Карты (map): Хэш-таблицы (ключ-значение).
  • Структуры: Пользовательские типы данных.
  • Интерфейсы: Контракты для описания поведения.

2.3 Управляющие конструкции #

2.3.1 if #

Условные операторы используются для выполнения блоков кода при выполнении условий.

Пример:

if x := 10; x > 5 {
    fmt.Println("x больше 5")
} else {
    fmt.Println("x меньше или равно 5")
}

2.3.2 for #

Единственная конструкция для создания циклов, может использоваться как while или бесконечный цикл.

Пример:

for i := 0; i < 5; i++ {
    fmt.Println(i)
}

// Использование как while
n := 0
for n < 3 {
    fmt.Println(n)
    n++
}

2.3.3 switch #

Go предоставляет мощный и лаконичный механизм ветвлений.

Пример:

day := "среда"
switch day {
case "понедельник", "вторник":
    fmt.Println("Начало недели")
case "пятница":
    fmt.Println("Конец недели")
default:
    fmt.Println("Середина недели")
}

2.3.4 select #

Используется для обработки данных из нескольких каналов в конкурентных приложениях. Подробнее это будет рассмотрено в разделе про многопоточность.


2.4 Функции #

Функции в Go — это основные строительные блоки. Они могут принимать параметры и возвращать результаты.

Пример простой функции: #

func greet(name string) string {
    return "Привет, " + name + "!"
}

fmt.Println(greet("Мир"))

Именованные возвращаемые значения: #

Позволяют дать имена возвращаемым значениям, что делает код более читаемым.

Пример:

func divide(a, b int) (result int, err error) {
    if b == 0 {
        err = fmt.Errorf("деление на ноль")
        return
    }
    result = a / b
    return
}

res, err := divide(10, 2)
if err != nil {
    fmt.Println("Ошибка:", err)
} else {
    fmt.Println("Результат:", res)
}

Вариативные параметры: #

Функции могут принимать переменное число аргументов.

Пример:

func sum(nums ...int) int {
    total := 0
    for _, num := range nums {
        total += num
    }
    return total
}

fmt.Println(sum(1, 2, 3, 4, 5)) // 15

2.5 Работа с указателями #

Указатели в Go — это переменные, которые хранят адрес памяти других переменных.

Основные операции с указателями: #

  • &: Оператор взятия адреса.
  • *: Оператор разыменования (доступ к значению по адресу).

Пример:

x := 10
p := &x        // Указатель на x
fmt.Println(*p) // 10 (разыменование указателя)

*p = 20        // Изменяем значение через указатель
fmt.Println(x)  // 20

Указатели как аргументы функций: #

Используются для передачи переменных по ссылке.

Пример:

func increment(p *int) {
    *p++
}

x := 5
increment(&x)
fmt.Println(x) // 6