← Назад к курсу

Бесплатный пробный урок: Golang Developer

Пройдите пару настоящих уроков этого курса — регистрация не требуется.

01

Урок 1: Пакеты, комментарии, переменные и операторы

Пакеты. Комментарии.

Любой код в Go хранится внутри пакета. Пакет — это папка, которая содержит файлы .go.

Давайте рассмотрим первый простой пример создания программы на Go:

main.go
package main

import "fmt"

func main() {
    fmt.Println("Salem Bitlab!")
}
Output:Salem Bitlab!
GOLANG
Результат

Для выполнения данной программы мы использовали пакеты main и fmt.

package main — это главный пакет. Он обязательно должен содержать функцию func main(), которая является точкой входа в программу. При запуске Go-приложения именно эта функция вызывается первой.

package fmt — стандартный пакет, который используется для вывода данных в консоль. Помимо вывода, он также поддерживает форматированный ввод и вывод данных.

Когда программа становится больше, читать и понимать код становится сложнее. Чтобы упростить понимание логики программы, используются комментарии.

Комментарии нужны для пояснения кода и его логического разделения. Они не участвуют в компиляции и никак не влияют на выполнение программы.

Виды комментариев

02

Урок 2: Условные конструкции и логические операторы

Что такое условия в Go?

В реальных программах код не всегда выполняется сверху вниз одинаково. Иногда программа должна принять решение: выполнить один блок кода или другой.

Например:

  • если возраст пользователя больше или равен 18 — разрешить доступ;
  • если пароль правильный — войти в систему;
  • если баланс достаточный — выполнить оплату;
  • если оценка высокая — вывести сообщение об успехе.

Для таких ситуаций в Go используются условные конструкции. Они позволяют программе выбирать, какой код нужно выполнить.

Условие — это выражение, результатом которого всегда является true или false.

Как работает условие?

Условная конструкция проверяет выражение. Если результат выражения равен true, выполняется один блок кода. Если результат равен false, этот блок пропускается или выполняется другой блок.

Конструкция if

Самая простая условная конструкция — это if. Она выполняет код только в том случае, если условие истинно.

main.go
package main

import "fmt"

func main() {
    age := 20

    if age >= 18 {
        fmt.Println("Доступ разрешён")
    }
}
Output:Доступ разрешён
GOLANG
Результат

Здесь программа проверяет условие age >= 18. Значение переменной age равно 20, поэтому условие истинно. Значит, код внутри блока if выполнится.

Важно: в Go условие внутри if не пишется в круглых скобках. Но фигурные скобки { } обязательны.

Конструкция if ... else

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

main.go
package main

import "fmt"

func main() {
    age := 15

    if age >= 18 {
        fmt.Println("Доступ разрешён")
    } else {
        fmt.Println("Доступ запрещён")
    }
}
Output:Доступ запрещён
GOLANG
Результат

Значение age равно 15. Условие age >= 18 возвращает false. Поэтому блок if не выполняется, а выполняется блок else.

03

Урок 3: Циклы и оператор for

Что такое цикл?

Цикл — это последовательность инструкций, которая позволяет выполнить некоторые действия множество раз.

В программировании очень часто бывают ситуации, когда одно и то же действие нужно повторить несколько раз. Например:

  • вывести числа от 1 до 10;
  • посчитать сумму чисел;
  • прочитать несколько значений с консоли;
  • обработать список студентов;
  • напечатать таблицу умножения.

Без циклов пришлось бы писать одинаковый код много раз вручную. Циклы позволяют сделать код короче, понятнее и удобнее.

В Go есть всего один цикл — for, но он может принимать разные формы.

Как работает цикл?

  • сначала задаётся начальное значение;
  • затем проверяется условие;
  • если условие истинно, выполняется тело цикла;
  • после этого значение изменяется;
  • затем условие проверяется снова.

Классический for

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

Например, если нужно вывести числа от 0 до 4:

main.go
package main

import "fmt"

func main() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}
Output:0 1 2 3 4
GOLANG
Результат

Конструкция цикла состоит из трёх частей:

  • i := 0 — инициализация (стартовое значение)
  • i < 5 — условие (пока истинно — цикл работает)
  • i++ — шаг (изменение переменной после каждой итерации)

Таким образом цикл сработал 5 раз — пока i не стал равен 5.

Пример: вывести числа от 1 до 10

Очень частая задача — вывести числа в определённом диапазоне. Для этого можно использовать обычный цикл for.

main.go
package main

import "fmt"

func main() {
    for i := 1; i <= 10; i++ {
        fmt.Println(i)
    }
}
Output:1 2 3 4 5 6 7 8 9 10
GOLANG
Результат

В этом примере переменная i начинается с 1. Цикл работает до тех пор, пока i <= 10. После каждой итерации значение i увеличивается на 1.

Пример: сумма чисел

Циклы часто используются для накопления результата. Например, можно посчитать сумму чисел от 1 до 5.

main.go
package main

import "fmt"

func main() {
    sum := 0

    for i := 1; i <= 5; i++ {
        sum = sum + i
    }

    fmt.Println(sum)
}
Output:15
GOLANG
Результат

Здесь переменная sum хранит общий результат. На каждой итерации мы добавляем к ней текущее значение i.

Как меняется sum:

  • i = 1, sum = 0 + 1 = 1
  • i = 2, sum = 1 + 2 = 3
  • i = 3, sum = 3 + 3 = 6
  • i = 4, sum = 6 + 4 = 10
  • i = 5, sum = 10 + 5 = 15
04

Урок 4: Срезы

Что такое срез?

Срез (slice) — это последовательный набор элементов одного типа. В отличие от массивов, срезы имеют динамическую длину: в них можно добавлять новые элементы и удалять существующие.

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

Поэтому в Go чаще всего работают именно со срезами, а не с обычными массивами.

Срезы — это как казахский той: можно запланировать мероприятие на 200 человек, а сколько гостей будет в итоге — неизвестно. Может 150? 250? Или все 300? Срезы обладают теми же качествами, что и организаторы тоя — гибкостью.

Мейрам "Пунктуальность" Тойбастаров — тот, кто "никогда" не опаздывает и смыслит в срезах

Главное отличие среза от массива — у среза длина может изменяться во время работы программы.

Массив vs срез

Визуально массив и срез очень похожи, но между ними есть важная разница.

Массив

Размер фиксированный. Если массив создан на 5 элементов, он всегда будет содержать ровно 5 элементов.

Срез

Размер динамический. В срез можно добавлять элементы и получать новый увеличенный срез.

В Go срез записывается почти как массив, но без указания размера внутри квадратных скобок.

Создание среза

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

Main.go
package main

import "fmt"

func main() {
    boxers := []string{"Muhammad Ali", "Mike Tyson", "George Foreman", "Joe Frazier"}
    for _, value := range boxers {
        fmt.Println(value)
    }
}
Output:Muhammad Ali Mike Tyson George Foreman Joe Frazier
GOLANG
Результат

Обратите внимание: в [] мы не указали длину — именно поэтому это slice.

Если написать [4]string, это будет массив. Если написать []string, это будет срез.

Срез разных типов

Срез может хранить элементы разных типов данных, но внутри одного среза все элементы должны быть одного типа.

Срез чисел:

numbers := []int{10, 20, 30, 40}

Срез строк:

cities := []string{"Almaty", "Astana", "Paris"}

Срез логических значений:

answers := []bool{true, false, true}