Golang справочник

Полезные команды и конструкции golang

Содержимое страницы

Вот базовая структура Go-программы, паттерны обработки ошибок и сравнение каналов и горутин.

зайцы вокруг знака golang

Чек-лист по языку 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:

  1. Возвращайте ошибки как значения: Функции, которые могут завершиться с ошибкой, должны возвращать ошибку как последнее возвращаемое значение. Например:
func Hello(name string) (string, error) {
    if name == "" {
        return "", errors.New("empty name")
    }
    message := fmt.Sprintf("Hi, %v. Welcome!", name)
    return message, nil
}
  1. Всегда проверяйте наличие ошибок: После вызова функции, которая возвращает ошибку, немедленно проверьте, не является ли ошибка не nil. Например:
result, err := SomeFunction()
if err != nil {
    // Обработка ошибки
    log.Fatal(err)
}
  1. Используйте обертывание ошибок: При передаче ошибок вверх по цепочке вызовов, оборачивайте их, добавляя контекст с помощью fmt.Errorf() с глаголом %w. Например:
f, err := os.Open(path)
if err != nil {
    return nil, fmt.Errorf("open failed: %w", err)
}
  1. Используйте defer для очистки: Используйте defer, чтобы гарантировать правильное закрытие или очистку ресурсов, даже если произойдет ошибка.

  2. Создавайте пользовательские типы ошибок: Реализуйте интерфейс error для пользовательских типов ошибок, чтобы предоставить более подробную информацию об ошибке.

  3. Используйте пакет errors: Используйте функции, такие как errors.New(), для создания простых сообщений об ошибках, и errors.Is() или errors.As() для проверки и преобразования типов ошибок.

  4. Избегайте использования panic: Резервируйте panic для действительно непрерывных ситуаций. Обычная обработка ошибок должна использовать возвращаемые значения.

  5. Предоставляйте явную информацию об ошибках: Делайте сообщения об ошибках ясными и информативными, чтобы помочь в отладке и устранении неполадок.

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

Рекомендации по использованию горутин и каналов в Go

Эффективное использование горутин

  1. Избегайте избыточного создания горутин: Создавайте горутины с умом, учитывая характер задачи и то, будет ли от этого выгода от параллельного выполнения.

  2. Правильная синхронизация: Используйте механизмы синхронизации, такие как каналы или группы ожидания, для эффективного управления горутинами и предотвращения потери ресурсов.

  3. Учитывайте характер задачи: Оцените, действительно ли задача выигрывает от параллельного выполнения, прежде чем использовать горутины.

Эффективное использование каналов

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

  2. Размер буфера: При использовании буферизованных каналов тщательно подумайте о размере буфера, чтобы сбалансировать производительность и использование ресурсов.

  3. Правильно закрывайте каналы: Убедитесь, что каналы закрываются, когда больше не будет отправляться данные, чтобы избежать тупиков и утечек ресурсов.

Модели конкуренции

  1. Модель пула рабочих: Реализуйте пулы рабочих с использованием горутин и каналов для эффективного распределения задач и сбора результатов.

  2. Модель производитель-потребитель: Используйте горутины в качестве производителей и потребителей, с каналами, обеспечивающими поток данных между ними.

Обработка ошибок и управление ресурсами

  1. Используйте defer для очистки: Используйте операторы defer, чтобы гарантировать правильную очистку ресурсов, даже при наличии ошибок.

  2. Обработка паник: Реализуйте recover() в долгоживущих горутинах, чтобы предотвратить завершение всей программы из-за паники в одной горутине.

Общение и синхронизация

  1. Предпочтение каналам вместо общей памяти: Используйте каналы для общения между горутинами, чтобы избежать гонок и упростить синхронизацию.

  2. Используйте select для нескольких каналов: Используйте оператор select, чтобы обрабатывать несколько операций с каналами параллельно.

Производительность

  1. Ограничьте параллельные операции: Используйте семафоры или пулы рабочих для ограничения количества параллельных операций и предотвращения истощения ресурсов.

  2. Избегайте преждевременной оптимизации: Профилируйте свой код, чтобы выявить узкие места, прежде чем применять оптимизации конкуренции.

Тестирование и отладка

  1. Используйте детектор гонок: Регулярно запускайте свои тесты с флагом -race, чтобы обнаружить гонки данных.

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

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

См. другие статьи технического блога.

Обновление golang на Linux

  1. перейдите и скачайте новую версию: https://go.dev/doc/install
  2. удалите старую:
sudo rm -rf /usr/local/go
  1. установите новую:
cd Downloads
sudo tar -C /usr/local -xzf go1.24.3.linux-amd64.tar.gz

Полезные ссылки