Найти в Дзене
Я, Golang-инженер

#36. Визуализация способов записи и чтения из файла. Фрагмент текстового квеста

Оглавление

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

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

Возвращаюсь иногда к конспектам в бумажным блокноте или своим проектам на GitHub. Решил, что будет полезно визуализировать часть информации. Для этого собрал сведения в одном месте, плюс добавил инфо по обработке ошибок.

Также посмотрим на примере текстового квеста реализацию работу с файлами.

1. Визуализация

Ниже представлены четыре блока по работе с данными:

  • Запись данных в с файл;
  • Создание файла с одновременным назначением права доступа и записи данных;
  • Чтение из файла;
  • Открытие файла для записи.
Сборник информации
Сборник информации

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

О каких подводных камнях идёт речь? Несколько примеров:

  • Невозможно сделать запись в файл после его открытия через os.Open(fileName), поскольку функция Open открывает файл для чтения, а не записи;
  • Если после os.Open ты прочитал файл каким-либо образом, то чтобы прочитать его повторно, нужно повторно использовать os.Open;
  • Если создавать и делать запись в файл через os.WriteFile, а файл уже существует, то его содержимое будет удалено. И новое содержимое будет записано поверх, а не в дополнение к имеющемуся содержимому.

Вообще, приходит понимание, что официальная документация - это то, чем предстоит постоянно пользоваться. И нужно учиться "дружить" с документацией за счёт регулярного к ней обращения. Поскольку в различных блогах могут донести часть информации, либо трактовать информацию не совсем так, как оно на самом деле.

Я делаю так: открываю интересующую меня информацию, пробую понять её по-английски, затем перевожу страницу - никогда подобной функцией браузера не пользовался, а здесь - это необходимость:

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

2. Применение

Я рассказывал ранее о текстовом квесте на Go. Пока не могу взяться за эту работу, т.к. нужно написать хорошую историю, а желания пока на это нет. Часть истории я написал, ниже поделюсь фрагментом, дальше работа встала. А сейчас хочу поговорить о способе чтения из файла file.Read.

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

Т.е., вместо фрагмента кода, который позволяет прочитать весь файл:

buf := make([]byte, info.Size())

Могу записать, например:

buf := make([]byte, 25)

Если в файл записано более 25 байт информации, то мы прочитаем только часть файла. Либо, если в файл записано менее 25 байт информации, оставшаяся часть будет прочитана пробелами (и при выводе в терминал, выведутся пробелы после содержания файла).

Когда дело доходит до печати информации в терминал, мы можем задать произвольный диапазон печати из прочитанного буфера.

Пример: у меня есть рассказ в одном файле txt - основная история текстового квеста. Мне нужно чтобы он выводился определёнными частями в терминал в нужный момент. Как это сделать? Например, так:

fmt.Println(string(buf[:1500]))

Это означает, что в терминал будет выведена информация из буфера с начала по 1500й байт.

Проблема: придётся вручную высчитывать, на каком байте заканчивается фрагмент рассказа из файла txt.

На помощь приходит функция Index пакета strings. Нужно будет в файле рассказа сделать метки, и по этим меткам искать необходимый байт. А код будет выглядеть примерно так:

indexEnter := strings.Index(string(buf), "⌘")
fmt.Println(string(buf[:indexEnter]))
buf = buf[indexEnter:]

В данном примере меткой служит спецсимвол "достопримечательность" - ⌘. Его потребуется расставить по главам в тексте.

Далее показываю часть того рассказа, что я написал.

3. Фрагмент текстового квеста

Написал начало истории, т.е. процента 3 от полного объёма рассказа. И реализовал на Go постепенный вывод информации в терминал, что добавляет красоты приложению:

Фрагмент вывода истории в терминал с задержкой
Фрагмент вывода истории в терминал с задержкой

--//--//--

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

 Weronika https://unsplash.com/photos/wSEv7Nanuxc
Weronika https://unsplash.com/photos/wSEv7Nanuxc

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