Эта глава — своего рода «швейцарский нож» разработчика. Стандартная библиотека Go (она же stdlib) настолько мощная, что во многих случаях вам не понадобятся сторонние зависимости.
Реальный мир программирования — это умение эффективно использовать готовые кирпичики. В Go стандартная библиотека считается одной из лучших в индустрии: она лаконична, быстра и безопасна.
Работа со строками
Пакет strings содержит всё необходимое для манипуляций с текстом.
package main
import (
"fmt"
"strings"
)
func main() {
fmt.Println(
strings.Contains("test", "es"), // true
strings.Count("test", "t"), // 2
strings.HasPrefix("test", "te"), // true
strings.Join([]string{"a", "b"}, "-"), // "a-b"
strings.Replace("aaaa", "a", "b", 2), // "bbaa"
strings.Split("a-b-c-d-e", "-"), // []string{"a","b","c","d","e"}
strings.ToUpper("test"), // "TEST"
)
}
[!TIP] Производительность Если вам нужно склеить тысячи строк в цикле, не используйте
+илиJoin. Используйтеstrings.Builder— это гораздо быстрее и эффективнее расходует память.
Ввод / Вывод (I/O)
Два главных интерфейса в Go — это io.Reader (чтение) и io.Writer (запись).
os.File,net.Conn,bytes.Buffer— все они реализуют эти интерфейсы.- Функция
io.Copy(dst, src)позволяет перекачивать данные из любого “читателя” в любого “писателя”.
Файловая система
[!WARNING] Важное обновление Функции из старого пакета
ioutilтеперь находятся в пакетахos(работа с файлами) иio(вспомогательные функции).
Чтение и запись файлов
Самый простой способ прочитать файл целиком в 2026 году:
package main
import (
"fmt"
"os"
)
func main() {
// Раньше было ioutil.ReadFile, теперь os.ReadFile
bs, err := os.ReadFile("test.txt")
if err != nil {
return
}
fmt.Println(string(bs))
}
Создание файла
file, err := os.Create("test.txt")
if err == nil {
defer file.Close()
file.WriteString("Привет, Go!")
}
Обход папок (Walk)
Для рекурсивного обхода папок лучше использовать filepath.WalkDir (он быстрее, чем старый Walk):
filepath.WalkDir(".", func(path string, d os.DirEntry, err error) error {
fmt.Println(path, d.IsDir())
return nil
})
Ошибки (Errors)
Современный Go поощряет “оборачивание” ошибок для сохранения контекста:
import "fmt"
func main() {
err := fmt.Errorf("ошибка в модуле X: %w", baseError)
}
Спецификатор %w позволяет позже проверить “корень” ошибки через errors.Is или errors.As.
Сортировка
Начиная с Go 1.21, для простых срезов лучше использовать новый пакет slices:
import "slices"
func main() {
ints := []int{4, 2, 1, 5}
slices.Sort(ints) // Быстро и просто (Generics!)
}
Для сложных структур по-прежнему используется пакет sort, где нужно реализовать интерфейс с методами Len, Less и Swap.
Сетевое программирование
HTTP Сервер
Go позволяет поднять сервер буквально в несколько строк:
package main
import (
"net/http"
"io"
)
func hello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "<h1>Hello World!</h1>")
}
func main() {
// В Go 1.22+ роутинг стал мощнее (поддержка методов GET/POST в HandleFunc)
http.HandleFunc("GET /hello", hello)
http.ListenAndServe(":9000", nil)
}
RPC (Remote Procedure Call)
Хотя стандартный net/rpc всё еще в библиотеке, в современной разработке для взаимодействия между сервисами чаще используют gRPC или Twitch RPC. Стандартный пакет хорош для простых внутренних инструментов на Go.
Командная строка (Flags)
Для создания CLI-утилит используется пакет flag:
max := flag.Int("max", 100, "Максимальное значение")
flag.Parse()
fmt.Println(*max) // Обратите внимание: флаг возвращает указатель
Синхронизация: Mutex
Если горутины обращаются к одной переменной, нужно использовать sync.Mutex, чтобы избежать состояния гонки (race condition).
var (
mu sync.Mutex
count int
)
func increment() {
mu.Lock()
count++
mu.Unlock()
}
[!TIP] defer с Mutex Всегда пишите
mu.Lock(); defer mu.Unlock(). Это гарантирует разблокировку, даже если в коде случится паника.
Задачи
- I/O: Напишите программу-аналог
cat, которая читает файл и выводит его в консоль, используяio.Copyиos.Stdout. - Хэши: Сравните два файла по их контрольной сумме SHA-256 (пакет
crypto/sha256). - HTTP: Создайте сервер, который по адресу
/timeотдает текущее время в формате JSON. - Flags: Напишите утилиту, которая принимает флаг
-nameи выводит “Привет, [name]!”.
Полезные ссылки
- Go Packages (pkg.go.dev) — официальная документация всех пакетов.
- Go by Example: Strings
- Go Blog: I/O Package update — почему
ioutilбольше не нужен. - Standard Library Cookbook — паттерны проектирования в Go.
```