Golang для новичков: основные понятия и примеры кода
Go (или Golang) — это язык программирования, созданный в Google. Go прост, быстр, идеально подходит для создания микросервисов, API, командных утилит и сетевых приложений.
Эта статья быстро познакомит тебя с основами Go и позволит за несколько минут написать своё первое приложение.
🔹 Почему Go?
Golang имеет ряд важных преимуществ:
- ✅ Простота: понятный синтаксис, похожий на C и Python.
- 🚀 Скорость: высокая производительность и быстрая компиляция.
- 🔄 Параллелизм: простая и эффективная работа с потоками через goroutines.
- 📦 Удобные модули: встроенный менеджер зависимостей.
- 🛠 Кроссплатформенность: легко собирать приложения под Windows, Linux и macOS.
📌 Установка Go
- Скачай последнюю версию Go отсюда (выбирай версию для своей ОС).
- Установи и проверь в терминале:
go version
Если увидишь версию, значит всё получилось 🎉.
🧑💻 Первая программа на Go
package main
import "fmt"
func main() {
fmt.Println("Привет, мир!")
}
go run hello.go
go build hello.go ./hello
🚀 Что произошло сейчас?
Ты только что написал и запустил свою первую программу на Go. Но давай кратко разберёмся, что именно произошло:
- Ты создал файл с расширением
.go, где указал, что это будет пакетmain. 📌 В Go приложение всегда стартует с функцииmain()из пакетаmain. - Ты импортировал стандартную библиотеку
fmt(от слова format) — одну из самых часто используемых в Go библиотек для работы с текстом и выводом данных. - Написал функцию
main(), из которой Go начинает выполнение программы. - Использовал функцию
fmt.Println()— она выводит текст на экран и автоматически добавляет перевод строки.
Когда ты написал команду go run hello.go, произошло следующее:
- Go-компилятор скомпилировал твой код в памяти.
- Полученный код был тут же запущен.
- Ты увидел результат выполнения — сообщение
Привет, мир!.
Если же ты использовал команду go build hello.go, то Go-компилятор создал исполняемый файл (бинарник), который можно запускать отдельно — и он будет работать даже без установленного Go.
💡 И это круто: программы на Go всегда компилируются в исполняемые файлы, которые легко распространять и запускать на любой платформе без дополнительных зависимостей!
Теперь можно двигаться дальше и познакомиться с основами синтаксиса Go.
🧩 Основы синтаксиса
var name string = "Вася"
age := 30 // короткое объявление переменной
fmt.Println("Имя:", name, "Возраст:", age)Часто задаваемые вопросы:
🔸 Какая разница между fmt.Print и fmt.Println?
fmt.Print()выводит текст ровно таким, каким вы его указали — без переноса строки в конце.fmt.Println()автоматически добавляет перевод строки (\n) после каждого вызова.
age := 25 // Go автоматически определит тип как int
func add(x int, y int) int {
return x + y
}
result := add(10, 5)
fmt.Println("Результат:", result)
if age > 18 {
fmt.Println("Взрослый")
} else {
fmt.Println("Ещё ребёнок")
}
// цикл for
for i := 0; i < 5; i++ {
fmt.Println(i)
}Структуры (structs) в Go — это удобный способ объединения данных в одну логическую сущность. Структура позволяет создать собственный тип, состоящий из нескольких полей, каждое из которых может иметь свой тип данных. Структуры помогают организовать данные и делают код более читабельным и простым для поддержки. Например, ты можешь создать структуру Person, которая будет хранить имя, возраст и профессию, и использовать её, чтобы легко передавать данные о человеке между функциями. В отличие от классов в других языках, структуры в Go не поддерживают наследование, но ты можешь добавлять к ним методы, что делает их удобным аналогом классов для организации логики и данных в твоём приложении.
Вот наглядный и понятный пример использования структур в Go с пояснениями:
package main
import "fmt"
// Определяем структуру Person с несколькими полями разных типов
type Person struct {
Name string
Age int
Job string
}
// Метод структуры Person, выводящий информацию о человеке
func (p Person) Introduce() {
fmt.Printf("Привет, я %s, мне %d лет, и я работаю %s.\n", p.Name, p.Age, p.Job)
}
func main() {
// Создание экземпляра структуры Person
person := Person{
Name: "Алиса",
Age: 28,
Job: "разработчиком на Go",
}
// Вызов метода структуры
person.Introduce()
// Доступ к отдельным полям структуры
fmt.Println("Имя человека:", person.Name)
fmt.Println("Возраст человека:", person.Age)
}Пояснения к примеру:
- Структура объявляется с помощью ключевого слова
type. - Поля структуры задаются внутри фигурных скобок
{}с указанием типа. - Метод привязывается к структуре через
(p Person)перед его названием, гдеp— это имя переменной структуры. - Создание структуры возможно как сразу с полями (
Person{}), так и пустой структуры с последующим заполнением полей отдельно. - Для вызова метода используется стандартный синтаксис:
person.Introduce().
🔀 Горутины и параллелизм (кратко)
В Go легко запускать параллельные задачи, которые реализованы в виде горутин (goroutine):
package main
import (
"fmt"
"time"
)
func task(name string) {
for i := 0; i < 3; i++ {
fmt.Println("Задача", name, "итерация", i)
time.Sleep(time.Second)
}
}
func main() {
go task("A") // запускается параллельно
go task("B") // тоже параллельно
time.Sleep(4 * time.Second)
}
Запусти код, и увидишь, как задачи выполняются одновременно. Разберем горутины подробнее.
🔸 Что такое горутина (goroutine)?
Горутина (goroutine) — это облегчённый поток, который позволяет выполнять код параллельно и асинхронно в рамках одного приложения.
Создаётся добавлением слова go перед вызовом функции:
go myFunction() // запустится параллельно с основной программой
Горутины — это очень лёгкие и дешёвые потоки. Ты можешь запустить тысячи горутин, и приложение будет работать эффективно и быстро.
📦 Пакеты и модули
Go управляет зависимостями через модули. Инициализируем новый модуль так:
go mod init myproject
Добавим библиотеку (например, популярный веб-фреймворк Gin):
go get github.com/gin-gonic/gin
package main
import "github.com/gin-gonic/gin"
func main() {
r := gin.Default()
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "Привет от Gin!"})
})
r.Run(":8080")
}
Ура! Мы запустили простое веб-приложение на Go!
🐾 Советы начинающим
- Изучай стандартную библиотеку — она очень мощная.
- Изучай простые проекты на GitHub, чтобы понять структуру приложений.
- Пиши много маленьких программ — Go отлично подходит для CLI-утилит.
Часто задаваемые вопросы
🔸 Почему Go — компилируемый язык, но так быстро собирается?
Go был специально разработан для быстрого компилирования, поэтому:
- компилятор Go эффективен и оптимизирован для скорости;
- в языке сознательно ограничено количество сложных конструкций, которые могли бы замедлить компиляцию;
- программы компилируются сразу в нативный код, что делает их выполнение быстрым, а сами бинарники — компактными.
🔸 Есть ли в Go классы?
Нет. В Go нет понятия классов в привычном понимании (как, например, в Java или C++). Но ты можешь использовать структуры (struct) и методы для них, чтобы организовывать код подобно классам.
🔸 Что такое generics (обобщения) и есть ли они в Go?
Generics (обобщения) — это механизм, который позволяет создавать функции и структуры, работающие с любыми типами данных, не привязываясь к конкретному типу.
Обобщения были добавлены в Go начиная с версии 1.18:
package main
import "fmt"
// Generic-функция, которая работает с любыми типами
func PrintSlice[T any](s []T) {
for _, v := range s {
fmt.Println(v)
}
}
func main() {
intSlice := []int{1, 2, 3}
strSlice := []string{"a", "b", "c"}
PrintSlice(intSlice) // работает с числами
PrintSlice(strSlice) // работает со строками
}
Таким образом, одна функция может быть универсальной и использоваться с разными типами данных без повторения кода.
🔸 Есть ли в Go обработка исключений (try/catch)?
В Go нет стандартного механизма исключений (try/catch), как в Java или Python. Вместо этого используются явные ошибки (errors):
Пример стандартного подхода обработки ошибок в Go:
package main
import (
"fmt"
"os"
)
func readFile(filename string) ([]byte, error) {
data, err := os.ReadFile(filename)
if err != nil {
return nil, err
}
return data, nil
}
func main() {
data, err := readFile("file.txt")
if err != nil {
fmt.Println("Ошибка чтения файла:", err)
return
}
fmt.Println("Данные файла:", string(data))
}
Это делает обработку ошибок явной, предсказуемой и безопасной.
🐹 Заключение
Go — простой и приятный язык, который открывает возможности для создания быстрых и надежных приложений. Он отлично подходит новичкам и опытным разработчикам, особенно если тебе важно писать быстрый и понятный код, легко поддерживать проекты и запускать приложения везде.