Файл — это не просто значок на рабочем столе. Это структурированный набор данных, который хранится на диске и управляется операционной системой (ОС).
В Go работа с файлами строится на двух китах:
- пакет os для низкоуровневых операций (открытие файла, закрытие файла, чтение или запись файла)
- пакет io для абстракции ввода-вывода
Когда файл открывается в Go, то на выходе получается объект типа *os.File. Это не просто “ссылка” на файл — это структура, которая содержит:
- дескриптор файла
- позиция чтения/записи (offset)
- метаданные
Дескриптор файла
Дескриптор — это целое число, которое ОС присваивает открытому файлу. Это как номер столика в ресторане: официант (ОС) знает, что заказ (данные) относится к вашему столику (файлу).
Зачем нужно? ОС использует дескрипторы для управления всеми открытыми файлами. Каждая программа имеет ограничение на количество дескрипторов (зависит от ОС).
file, _ := os.Open("awesome_file.txt")
fmt.Printf("Дескриптор файла %d\n", file.Fd()) // -> Выведет число, например, 3Позиция чтения и записи
Это указатель, который определяет, с какого места в файле начнется следующая операция чтения или записи в файл. Как работает?
- при открытии файла offset = 0 (начало файла)
- после чтения N байт offset сдвигается на N
- при записи offset перемещается в конец записанных данных
Метаданные
Объект os.File хранит информацию о файле:
- путь к файлу в файловой системе ОС
- режим доступа (чтение, запись и т.д.)
- права доступа (например -> 0644)
Права доступа — это набор разрешений, который определяет, какие действия могут выполнять разные категории пользователей в ОС с файлом. Обычно права задаются в восьмеричной системе (0XYZ), где:
- X — права владельца (User)
- Y — права группы (Group)
- Z — права остальных (Others)
Каждая цифра — сумма следующих флагов:
- 4 (r) — чтение: право открывать и просматривать содержимое файла
- 2 (w) — запись: право изменять или дописывать файл
- 1 (x) — выполнение: право запускать файл как программу
Например, 0644 означает, что владелец может читать и записывать файл (6 = 4 + 2), а группа и остальные имеют только право чтения (4).