Стандартная библиотека Go (Golang): полный обзор
Язык Go (Golang), разработанный в Google, славится своей лаконичностью, высокой производительностью и встроенной поддержкой конкурентности. Однако одной из главных его "суперсил" является мощная и продуманная стандартная библиотека. В отличие от многих других языков, где для решения базовых задач необходимо подключать сторонние зависимости, Go предоставляет всё необходимое "из коробки". В этой статье мы проведём полный обзор ключевых пакетов стандартной библиотеки Go, которые пригодятся каждому разработчику.
1. Ввод-вывод и работа с файлами: пакеты io, os, bufio
Пакет io — это фундамент для всех операций ввода-вывода. Его интерфейсы io.Reader и io.Writer являются одними из самых важных абстракций в Go. Фактически, любой источник данных (файл, сетевое соединение, строка) может быть представлен как Reader, а любой приёмник — как Writer.
Пакет os предоставляет функции для взаимодействия с операционной системой: открытие/создание файлов, чтение директорий, работа с переменными окружения.
Пакет bufio добавляет буферизацию, что значительно ускоряет чтение и запись больших объёмов данных.
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
// Открываем файл для чтения
file, err := os.Open("example.txt")
if err != nil {
panic(err)
}
defer file.Close()
// Создаём буферизованный сканер
scanner := bufio.NewScanner(file)
for scanner.Scan() {
fmt.Println(scanner.Text())
}
if err := scanner.Err(); err != nil {
fmt.Fprintln(os.Stderr, "Ошибка чтения:", err)
}
}
2. Работа с текстом и форматирование: пакеты strings, fmt, strconv
Пакет strings содержит сотни полезных функций для работы со строками: поиск, замена, разбиение, объединение, удаление пробелов и многое другое. Пакет strconv отвечает за преобразование строк в числа (и обратно), а также парсинг булевых значений.
Пакет fmt — это "швейцарский нож" для форматированного вывода. Он реализует функции Printf, Sprintf и Fprintf, которые работают с любыми типами, реализующими интерфейс Stringer.
package main
import (
"fmt"
"strconv"
"strings"
)
func main() {
// Разделение строки
parts := strings.Split("a,b,c", ",")
fmt.Println(parts) // [a b c]
// Преобразование строки в число
num, _ := strconv.Atoi("42")
fmt.Printf("Число: %d\n", num) // Число: 42
// Форматирование с шириной поля
fmt.Printf("|%10s|%5d|\n", "Привет", 123)
}
3. Сеть и HTTP: пакеты net, net/http
Пакет net предоставляет низкоуровневые примитивы для работы с TCP/UDP, DNS и IP-адресами. Но настоящей "звездой" является пакет net/http. Он позволяет создавать полноценные HTTP-серверы и клиенты без единой сторонней зависимости.
Благодаря встроенному http.ServerMux и middleware-подходу, вы можете легко маршрутизировать запросы, обрабатывать JSON, управлять куками и сессиями. Стандартная библиотека Go используется в production такими гигантами, как Docker, Kubernetes и Dropbox.
package main
import (
"encoding/json"
"fmt"
"net/http"
)
type Response struct {
Message string `json:"message"`
}
func helloHandler(w http.ResponseWriter, r *http.Request) {
if r.Method != http.MethodGet {
http.Error(w, "Метод не поддерживается", http.StatusMethodNotAllowed)
return
}
resp := Response{Message: "Привет, мир!"}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(resp)
}
func main() {
http.HandleFunc("/api/hello", helloHandler)
fmt.Println("Сервер запущен на :8080")
http.ListenAndServe(":8080", nil)
}
4. Конкурентность: пакеты sync, context
Go известен своей лёгкой моделью конкурентности на основе горутин (goroutines) и каналов (channels). Пакет sync предоставляет классические примитивы синхронизации: Mutex, RWMutex, WaitGroup и Once.
Пакет context — это стандартный способ управления временем жизни гор