Golang справочник
Полезные команды и конструкции golang
Вот базовая структура Go-программы, паттерны обработки ошибок и сравнение каналов и горутин.
Чек-лист по языку Go
Основной синтаксис
Объявление пакета
package main
Импорт пакетов
import "fmt"
import (
"fmt"
"math"
)
Основная функция
func main() {
// Ваш код здесь
}
Переменные и типы
Объявление переменной
var name string
var age int = 25
x := 10 // Краткое объявление
Базовые типы
- bool
- string
- int, int8, int16, int32, int64
- uint, uint8, uint16, uint32, uint64
- float32, float64
- complex64, complex128
Управляющие структуры
Условный оператор if
if x > 0 {
// код
} else if x < 0 {
// код
} else {
// код
}
Цикл for
for i := 0; i < 10; i++ {
// код
}
Цикл range
for index, value := range collection {
// код
}
Оператор switch
switch variable {
case value1:
// код
case value2:
// код
default:
// код
}
Функции
Объявление функции
func functionName(param1 type1, param2 type2) returnType {
// код
return value
}
Множественное возвращение
func divideAndRemainder(x, y int) (int, int) {
return x / y, x % y
}
Данные структуры
Массивы
var numbers int
numbers := int{1, 2, 3, 4, 5}
Срезы
slice := []int{1, 2, 3}
slice := make([]int, 3, 5)
Мапы
m := make(map[string]int)
m["key"] = value
Структуры
type Person struct {
Name string
Age int
}
p := Person{Name: "Alice", Age: 30}
Методы
Объявление метода
func (r Rectangle) Area() float64 {
return r.width * r.height
}
Интерфейсы
Объявление интерфейса
type Shape interface {
Area() float64
}
Конкуренция
Горутины
go functionName()
Каналы
ch := make(chan int)
ch <- value // Отправка
value := <-ch // Получение
Обработка ошибок
Проверка ошибок
if err != nil {
// Обработка ошибки
}
Оператор defer
defer file.Close()
Тестирование
Функция теста
func TestFunction(t *testing.T) {
// Код теста
}
Этот чек-лист охватывает самые важные конструкции языка Go и команды. Он включает в себя базовый синтаксис, управляющие структуры, функции, данные структуры, методы, интерфейсы, примитивы конкуренции и обработку ошибок. Помните, что Go подчеркивает простоту и читаемость, поэтому эти конструкции формируют основу для написания эффективного и понятного кода на Go.
Обработка ошибок в Go
Обработка ошибок в Go проста и явна, подчеркивая ясность и надежность. Вот ключевые техники для обработки ошибок в Go:
- Возвращайте ошибки как значения: Функции, которые могут завершиться с ошибкой, должны возвращать ошибку как последнее возвращаемое значение. Например:
func Hello(name string) (string, error) {
if name == "" {
return "", errors.New("empty name")
}
message := fmt.Sprintf("Hi, %v. Welcome!", name)
return message, nil
}
- Всегда проверяйте наличие ошибок: После вызова функции, которая возвращает ошибку, немедленно проверьте, не является ли ошибка не
nil
. Например:
result, err := SomeFunction()
if err != nil {
// Обработка ошибки
log.Fatal(err)
}
- Используйте обертывание ошибок: При передаче ошибок вверх по цепочке вызовов, оборачивайте их, добавляя контекст с помощью
fmt.Errorf()
с глаголом%w
. Например:
f, err := os.Open(path)
if err != nil {
return nil, fmt.Errorf("open failed: %w", err)
}
-
Используйте
defer
для очистки: Используйтеdefer
, чтобы гарантировать правильное закрытие или очистку ресурсов, даже если произойдет ошибка. -
Создавайте пользовательские типы ошибок: Реализуйте интерфейс
error
для пользовательских типов ошибок, чтобы предоставить более подробную информацию об ошибке. -
Используйте пакет
errors
: Используйте функции, такие какerrors.New()
, для создания простых сообщений об ошибках, иerrors.Is()
илиerrors.As()
для проверки и преобразования типов ошибок. -
Избегайте использования
panic
: Резервируйтеpanic
для действительно непрерывных ситуаций. Обычная обработка ошибок должна использовать возвращаемые значения. -
Предоставляйте явную информацию об ошибках: Делайте сообщения об ошибках ясными и информативными, чтобы помочь в отладке и устранении неполадок.
Следуя этим практикам, вы можете создать надежные программы на Go, которые эффективно обрабатывают ошибки и сохраняют ясность кода.
Рекомендации по использованию горутин и каналов в Go
Эффективное использование горутин
-
Избегайте избыточного создания горутин: Создавайте горутины с умом, учитывая характер задачи и то, будет ли от этого выгода от параллельного выполнения.
-
Правильная синхронизация: Используйте механизмы синхронизации, такие как каналы или группы ожидания, для эффективного управления горутинами и предотвращения потери ресурсов.
-
Учитывайте характер задачи: Оцените, действительно ли задача выигрывает от параллельного выполнения, прежде чем использовать горутины.
Эффективное использование каналов
-
Выберите подходящий тип канала: Используйте небуферизованные каналы для синхронизации и буферизованные каналы, когда вам нужно развязать операции отправки и получения.
-
Размер буфера: При использовании буферизованных каналов тщательно подумайте о размере буфера, чтобы сбалансировать производительность и использование ресурсов.
-
Правильно закрывайте каналы: Убедитесь, что каналы закрываются, когда больше не будет отправляться данные, чтобы избежать тупиков и утечек ресурсов.
Модели конкуренции
-
Модель пула рабочих: Реализуйте пулы рабочих с использованием горутин и каналов для эффективного распределения задач и сбора результатов.
-
Модель производитель-потребитель: Используйте горутины в качестве производителей и потребителей, с каналами, обеспечивающими поток данных между ними.
Обработка ошибок и управление ресурсами
-
Используйте defer для очистки: Используйте операторы
defer
, чтобы гарантировать правильную очистку ресурсов, даже при наличии ошибок. -
Обработка паник: Реализуйте
recover()
в долгоживущих горутинах, чтобы предотвратить завершение всей программы из-за паники в одной горутине.
Общение и синхронизация
-
Предпочтение каналам вместо общей памяти: Используйте каналы для общения между горутинами, чтобы избежать гонок и упростить синхронизацию.
-
Используйте select для нескольких каналов: Используйте оператор
select
, чтобы обрабатывать несколько операций с каналами параллельно.
Производительность
-
Ограничьте параллельные операции: Используйте семафоры или пулы рабочих для ограничения количества параллельных операций и предотвращения истощения ресурсов.
-
Избегайте преждевременной оптимизации: Профилируйте свой код, чтобы выявить узкие места, прежде чем применять оптимизации конкуренции.
Тестирование и отладка
-
Используйте детектор гонок: Регулярно запускайте свои тесты с флагом -race, чтобы обнаружить гонки данных.
-
Написание тестов для параллельного кода: Создавайте тесты, специально проверяющие ваши пути параллельного кода, чтобы обеспечить надежность.
Следуя этим рекомендациям, вы можете эффективно использовать модель конкуренции Go, делая свои программы более эффективными, поддерживаемыми и менее подверженными распространенным проблемам, связанным с конкуренцией.
См. другие статьи технического блога.
Обновление golang на Linux
- перейдите и скачайте новую версию: https://go.dev/doc/install
- удалите старую:
sudo rm -rf /usr/local/go
- установите новую:
cd Downloads
sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz
Полезные ссылки
- https://go.dev/
- Генерация PDF в GO - библиотеки и примеры
- Производительность AWS Lambda: JavaScript vs Python vs Golang
- Исправление ошибки GORM AutoMigrate в PostgreSQL
- Переустановка Linux
- Справочник Bash
- Справочник Markdown
- Декодирование и печать JWT-токена
- Популярность языков программирования и фреймворков
- Пространство Golang
- Альтернативы Beautiful Soup для Go