Приложения

Приложения #

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


Таблица стандартных библиотек #

БиблиотекаОписание
fmtФорматированный ввод/вывод, печать и сканирование.
osРабота с операционной системой: файлы, переменные окружения, процессы.
io, io/ioutilПотоковый ввод/вывод, чтение и запись данных.
stringsМанипуляции со строками (поиск, замена, разбиение и т.д.).
strconvПреобразование строк в числа и наоборот.
timeРабота с временем, таймерами и форматированием дат.
net/httpСоздание HTTP-серверов и клиентов.
encoding/jsonРабота с JSON: кодирование и декодирование.
syncПримитивы синхронизации (мьютексы, WaitGroup).
math/randГенерация случайных чисел.
contextУправление временем выполнения и отменой горутин.
database/sqlРабота с реляционными базами данных.
logЛогирование с поддержкой форматирования и уровней.
testingНаписание тестов и бенчмарков.

Типовые ошибки и их исправления #

ОшибкаПричинаИсправление
fatal error: all goroutines are asleep - deadlock!Мертвый блок, например, из-за закрытого канала или отсутствия получателя.Убедитесь, что каналы правильно закрыты, и данные считываются.
nil pointer dereferenceПопытка обратиться к nil указателю или полю структуры.Проверьте, инициализирована ли переменная перед использованием.
index out of rangeВыход за пределы массива или среза.Убедитесь, что индекс находится в допустимом диапазоне.
imported but not usedИмпортирован пакет, но не используется в коде.Удалите неиспользуемые импорты или используйте пакет.
declared and not usedОбъявлена, но не используется переменная.Удалите переменную или начните ее использовать.
undefined: xxxПопытка использования несуществующего идентификатора.Проверьте правильность имен и наличие импорта пакета.
assignment to entry in nil mapПопытка изменить неинициализированную карту.Инициализируйте карту с помощью make.
Ошибки при go mod tidyКонфликты зависимостей или отсутствие модуля.Проверьте файл go.mod и версию зависимости, добавьте недостающие модули вручную.

Полезные шаблоны кода #

Обработка ошибок #

if err != nil {
    log.Fatalf("Произошла ошибка: %v", err)
}

Работа с каналами и WaitGroup #

package main

import (
    "fmt"
    "sync"
)

func worker(id int, wg *sync.WaitGroup) {
    defer wg.Done()
    fmt.Printf("Worker %d starting\n", id)
    fmt.Printf("Worker %d done\n", id)
}

func main() {
    var wg sync.WaitGroup

    for i := 1; i <= 3; i++ {
        wg.Add(1)
        go worker(i, &wg)
    }

    wg.Wait()
}

Чтение файла #

package main

import (
    "fmt"
    "io/ioutil"
)

func main() {
    data, err := ioutil.ReadFile("example.txt")
    if err != nil {
        fmt.Println("Ошибка чтения файла:", err)
        return
    }
    fmt.Println(string(data))
}

Отправка HTTP-запроса #

package main

import (
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    resp, err := http.Get("https://api.example.com/data")
    if err != nil {
        fmt.Println("Ошибка запроса:", err)
        return
    }
    defer resp.Body.Close()

    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        fmt.Println("Ошибка чтения ответа:", err)
        return
    }

    fmt.Println(string(body))
}

Запуск таймера #

package main

import (
    "fmt"
    "time"
)

func main() {
    timer := time.NewTimer(2 * time.Second)
    <-timer.C
    fmt.Println("Timer expired")
}