Запись файлов и временные файлы
WriteFile, флаги OpenFile и временные файлы
«Запись файлов и временные файлы» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.
os.WriteFile
os.WriteFile атомарно записывает срез байтов в файл, предварительно усекая его. Это простой способ для небольших файлов.
err := os.WriteFile("output.txt", []byte("hello"), 0644)
if err != nil { log.Fatal(err) }os.Create и defer Close
os.Create создаёт файл или усекает существующий и возвращает *os.File. Всегда закрывайте файл с помощью defer.
f, err := os.Create("output.txt")
if err != nil { return err }
defer f.Close()
f.WriteString("hello\n")os.OpenFile с флагами
Используйте os.OpenFile для режимов добавления, создания при отсутствии или эксклюзивного создания:
f, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)bufio.Writer
Оберните файл в bufio.NewWriter, чтобы объединять небольшие записи в более крупные системные вызовы. Перед закрытием вызовите Flush(), чтобы записать все буферизованные данные.
w := bufio.NewWriter(f)
fmt.Fprintf(w, "line %d\n", i)
w.Flush()fmt.Fprintf
Записывайте форматированный текст в любой io.Writer, включая файлы:
fmt.Fprintf(f, "name: %s, age: %d\n", name, age)Шаблон атомарной записи файла
Запишите данные во временный файл, а затем переименуйте его в целевой файл. В POSIX переименование атомарно: читатели видят либо старый, либо новый файл, но никогда не видят частичную запись.
tmp, _ := os.CreateTemp("", "output-*.txt")
tmp.Write(data)
tmp.Close()
os.Rename(tmp.Name(), "output.txt")os.CreateTemp
os.CreateTemp(dir, pattern) создаёт временный файл в dir с уникальным именем, соответствующим pattern. Возвращается открытый файл. За удаление отвечает вызывающий код.
f, err := os.CreateTemp("", "upload-*.json")
defer os.Remove(f.Name()) // cleanupos.MkdirTemp
os.MkdirTemp создаёт временный каталог. Используйте его для тестовых данных или конвейеров обработки, создающих несколько временных файлов.
dir, err := os.MkdirTemp("", "batch-*")
defer os.RemoveAll(dir)Разрешения файлов
Передавайте биты разрешений Unix, например 0644 для прав rw владельца и прав r группы и остальных пользователей, последним аргументом функциям в стиле Create. Маска umask процесса может дополнительно ограничить эти права.
Проверка ошибок записи
f.WriteString и fmt.Fprintf могут возвращать ошибки, например при заполненном диске или недостаточных разрешениях. Проверяйте ошибки или накапливайте их с помощью оболочки записи, которая сохраняет первую ошибку.
sync.File не является безопасным для параллельного доступа
Несколько горутин, одновременно записывающих в один *os.File, могут перемешивать записи. Используйте мьютекс или одну выделенную горутину записи.
Быстрая проверка
Почему шаблон «записать во временный файл, затем переименовать» считается атомарным?
Итоги: запись файлов
Основные положения:
- os.WriteFile: простая перезапись; bufio.Writer: объединение небольших записей
- Атомарная запись: временный файл и переименование
- os.CreateTemp и os.MkdirTemp для временных ресурсов; всегда откладывайте очистку с помощью defer
- Проверяйте ошибки записи; синхронизируйте параллельные записи
Часто задаваемые вопросы
Урок «Запись файлов и временные файлы» бесплатный?
Да — полный текст урока «Запись файлов и временные файлы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.
Чему я научусь в уроке «Запись файлов и временные файлы»?
WriteFile, флаги OpenFile и временные файлы Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Go Academy?
Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Запись файлов и временные файлы»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Go Academy?
Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Чтение файлов с os и bufio
- Запись файлов и временные файлы
- Кодирование и декодирование JSON
- Потоковая обработка JSON и CSV