0Pricing
Go Academy · Урок

Запись файлов и временные файлы

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()) // cleanup

os.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 — локальная установка не требуется.

Все уроки этого курса

  1. Чтение файлов с os и bufio
  2. Запись файлов и временные файлы
  3. Кодирование и декодирование JSON
  4. Потоковая обработка JSON и CSV
← Назад к Go Academy