284 подписчика

#45. Разбираем *os.File на примерах

Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.

Хой, джедаи и амазонки!

В этой статье на примере синтаксиса *os.File показываю, как можно работать с непонятной информацией в IT, чтобы шаг за шагом прийти к пониманию - что это, для чего использовать и как с этим работать.

1. Предыстория задачи

Бывает, что в курсах обучения даётся теория по программированию, которую никак не усвоить, пока смотришь видео или даже начинаешь с ней разбираться по статьям, официальной документации и так далее.

Только практика, практика и ещё раз практика. Короче, зубрёжка закрепляют информацию. Это не совсем правильно, без понимания "как оно работает", но результат даёт.

Так было, когда я изучал запись строк в файл. Так случилось сейчас, когда в курсе от SkillBox в модуле "Defer как инструмент гарантированного завершения", я встретил синтаксис *os.File.

Что это такое? Как с этим работать? Непонятно.

Решил, что непременно нужно с этим *os.File разобраться, прежде чем двигаться дальше - хотя практическую работу по этой теме я успешно сдал. Проблема, что практическая работа не требовала использовать *os.File. А в теоретической части модуля, этот синтаксис давался.

Полезно разобраться со всей теорией, что даётся в курсе - а не только в том кусочке, который нужен для сдачи практической работы.

Я упростил код из курса, где появлялся *os.File. Вот код:

Код с синтаксисом *os.File
Код с синтаксисом *os.File

Я написал странную на первый взгляд строку 11 - результатом печати будет что-то вроде &{0xc00007a180} - адрес хранения переменной file. Мне эта строка нужна, чтобы не перегружать код дополнительными функциями использования переменной file и чтобы компилятор не ругался на неиспользуемую переменную file.

2. Поиск информации

2.1. Что говорит официальная документация?

Возвращаемся к *os.File в строке 14 иллюстрации выше. Что это такое мне было непонятно - я впервые такое вижу. Идём в официальную документацию и пробуем разобраться:

Фрагмент описания из официальной документации
Фрагмент описания из официальной документации

Нижнюю строку могу перевести так: "*os.File представляет собой дескриптор открытого файла".

Понятнее не стало.

Найдём определение дескрипотора - это слово или словосочетание информационно-поискового языка, служащее для описания основного смыслового содержания документа или формулировки запроса при поиске информации.

Для простоты запоминания могу сказать так:

Дескрипотр - это как тег на веб-страницах.

С тегами всё должно быть понятно. Тег - слово или фраза для удобства навигации и поиска информации. По крайней мере в моём понимании.

Итак, заменив слово дескриптор на тег, получаем перевод значения *os.File с официальной документации:

*os.File представляет собой тег открытого файла.

Уже кое-что.

В предыдущей публикации я рассказывал о применении нейросети GPT в обучении Go. Самое время ею воспользоваться, чтобы лучше во всём этом разобраться.

2.2. Что такое *os.File по мнению нейросети?

Задал вопрос по *os.File в приложении Merlin для нейросети GPT-3:

Вопрос-ответ
Вопрос-ответ

Нейросеть привела три фрагмента кода. Вот они:

2.2.1. Первый пример кода - создание файла и запись данных

file, err := os.Create("example.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()

text := "Hello, world!"
_, err = file.WriteString(text)
if err != nil {
fmt.Println(err)
return
}


2.2.2. Второй пример кода - чтение данных из файла

file, err := os.Open("example.txt")
if err != nil {
fmt.Println(err)
return
}
defer file.Close()

data := make([]byte, 100)
count, err := file.Read(data)
if err != nil {
fmt.Println(err)
return
}

fmt.Printf("Read %d bytes: %q\n", count, data[:count])

2.2.3. Третий пример кода - удаление файла

err := os.Remove("example.txt")
if err != nil {
fmt.Println(err)
return
}

2.2.4. Нейросеть GPT-3.5

Для расширения кругозора, задал вопрос другой нейросети в ТГ-канале. Вот её ответы:

Ответ нейросети
Ответ нейросети

Второй пример:

Ответ нейросети
Ответ нейросети

Третий пример:

Ответ нейросети
Ответ нейросети

2.2.5. Анализ информации нейросети

Что общего в шести примерах от двух нейросетей? Нет упоминания синтаксиса *os.File. Очень странно, думаю я. Но зато появилось понимание, что *os.File явно связан с созданием самого файла. В данном случае - текстового .txt.

Используем ещё источник информации - учебный чат от SkillBox.

2.3. Что такое *os.File по мнению участников чата?

После вопроса, пришло два ответа. Ответ куратора направлял на изучение официальной документации.

Ещё был ответ обычного участника - студента SkillBox:

Фрагмент ответа
Фрагмент ответа

Goland - это платная IDE. Говорят, что весьма удобная.

Напомню, программировать можно и в "блокноте", так что вопрос удобства для меня пока не приоритет. К тому же, меня во всём устраивает моя LiteIDE, о которой я писал здесь (установка для Linux) и здесь - установка для Windows.

Попробовал я сделать так в своей IDE. Результат:

Функционал LiteIDE
Функционал LiteIDE

Т.е. подобный функционал по описанию синтаксиса есть не только в платной Goland. Что радует, хотя понятнее тоже особо не стало) Всё те же дескрипторы - как на официальной документации.

2.4. Синтез информации по *os.File

Изучил я пять источников:

  1. Пример кода и лекцию по нему;
  2. Официальная документация;
  3. Нейросети GPT-3 и GPT-3.5;
  4. Учебный чат;
  5. Встроенный в IDE справочник.

Обдумав полученную информацию, пришло понимание, я бы даже сказал - озарение. Я понял, что *os.File - это тип данных, который присваивается переменной при создании файла. Примерно такой же, как int, string и так далее.

Чтобы проверить эту гипотезу, воспользовался функционалом печати типа данных переменной в IDE. Вот что вышло:

Код с выводом в терминал типа данных переменной
Код с выводом в терминал типа данных переменной

В строке 11 я использовал спецификатор %T для вывода типа данных переменной. И получил небольшую долю удовольствия, когда убедился - что созданный файл имеет тип данных *os.File, что подтверждает мою гипотезу.

Итак, проведя собственное исследование, я выяснил, что непонятная конструкция *os.File - это просто тип переменной, в которой хранится адрес файла.

Просто из любопытства и чтобы освежить в памяти, посмотрю какой тип данных у срезов и массивов:

Создаём срез и массив
Создаём срез и массив

Всё, с *os.File разобрались. Добавлю сюда пример расширенного кода на GitHub, где используется *os.File - можно ознакомиться, чтобы лучше понять, для чего его использовать.

Если кратко - чтобы сократить функцию main() - мы помним, что каждая функция в идеале должна быть не более 15 строк - требование чистого кода. Вот для этих целей при работе с файлами полезно передавать тип данных *os.File из функции в функцию.

3. Выводы

Итак, я разобрался с непонятной мне информацией по *os.File. Можно привести алгоритм работы со сложной информацией без привязки к конкретному синтаксису или задаче.

Алгоритм работы с непонятной задачей:

  1. Идём в официальную документацию и изучаем всё как есть;
  2. Запускаем нейросеть и задаём ей вопросы;
  3. Обдумываем информацию, проверяем её на практике в IDE. Если остаются вопросы или необходимо перепроверить информацию, то...
  4. Задаём вопросы в учебные чаты/форумы. Не обязательно покупать курсы, чтобы получить доступ к чату. Есть бесплатные курсы с живым коммьюнити в ТГ-чатах. Например о таком курсе я рассказывал в нескольких статьях здесь или здесь <<<
  5. Систематизируем информацию.

Пройдя эти пять шагов, я уверен, что можно получить ответ практически на любой вопрос. По крайней мере я пока не сталкивался с задачей, которую не мог бы решить этот алгоритм.

--//--//--

Успехов, бро! Большое спасибо, что дочитал публикацию до конца.

Не ленись. Используй свои силы и интеллект для достижения цели. Будь энергичным, и ты справишься с любыми трудностями. Как в профессиональном, так, и могу тебе сказать, в личном плане.

Я желаю тебе вдохновения и успеха. Спасибо. Будем на связи.

--//--//--

PS Если захочешь купить курс от SkillBox, воспользуйся моей реферальной ссылкой. Ты получишь огромную скидку на курс и плюс в карму за помощь каналу.

 Isakov Eldiiar tomaspaint https://unsplash.com/photos/N0yEQjBSQlk
Isakov Eldiiar tomaspaint https://unsplash.com/photos/N0yEQjBSQlk

Бро, ты уже здесь? 👉 Подпишись на канал для новичков «Войти в IT» в Telegram, будем изучать IT вместе 👨‍💻👩‍💻👨‍💻