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