Это статья об основах программирования на Go. На канале я рассказываю об опыте перехода в IT с нуля, структурирую информацию и делюсь мнением.
Хой, джедаи и амазонки!
В этой статье на примере синтаксиса *os.File показываю, как можно работать с непонятной информацией в IT, чтобы шаг за шагом прийти к пониманию - что это, для чего использовать и как с этим работать.
1. Предыстория задачи
Бывает, что в курсах обучения даётся теория по программированию, которую никак не усвоить, пока смотришь видео или даже начинаешь с ней разбираться по статьям, официальной документации и так далее.
Только практика, практика и ещё раз практика. Короче, зубрёжка закрепляют информацию. Это не совсем правильно, без понимания "как оно работает", но результат даёт.
Так было, когда я изучал запись строк в файл. Так случилось сейчас, когда в курсе от SkillBox в модуле "Defer как инструмент гарантированного завершения", я встретил синтаксис *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. Результат:
Т.е. подобный функционал по описанию синтаксиса есть не только в платной Goland. Что радует, хотя понятнее тоже особо не стало) Всё те же дескрипторы - как на официальной документации.
2.4. Синтез информации по *os.File
Изучил я пять источников:
- Пример кода и лекцию по нему;
- Официальная документация;
- Нейросети GPT-3 и GPT-3.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. Можно привести алгоритм работы со сложной информацией без привязки к конкретному синтаксису или задаче.
Алгоритм работы с непонятной задачей:
- Идём в официальную документацию и изучаем всё как есть;
- Запускаем нейросеть и задаём ей вопросы;
- Обдумываем информацию, проверяем её на практике в IDE. Если остаются вопросы или необходимо перепроверить информацию, то...
- Систематизируем информацию.
Пройдя эти пять шагов, я уверен, что можно получить ответ практически на любой вопрос. По крайней мере я пока не сталкивался с задачей, которую не мог бы решить этот алгоритм.
--//--//--
Успехов, бро! Большое спасибо, что дочитал публикацию до конца.
Не ленись. Используй свои силы и интеллект для достижения цели. Будь энергичным, и ты справишься с любыми трудностями. Как в профессиональном, так, и могу тебе сказать, в личном плане.
Я желаю тебе вдохновения и успеха. Спасибо. Будем на связи.
--//--//--
PS Если захочешь купить курс от SkillBox, воспользуйся моей реферальной ссылкой. Ты получишь огромную скидку на курс и плюс в карму за помощь каналу.
Бро, ты уже здесь? 👉 Подпишись на канал для новичков «Войти в IT» в Telegram, будем изучать IT вместе 👨💻👩💻👨💻