Сейчас я читаю книгу "Эффективный Go" (к сожалению так и не понял кто автор). Свои заметки по ней буду писать в этом посте 🤠

> В блоке import импортируются пакеты, сущности из которых можно использовать в своем файлике с кодом. Бывают ситуации, когда несколько пакетов, которые вы хотите использовать, имеют одинаковое имя. Это недопустимо и приведет к конфликту. Для избежания конфликтов, можно присваивать пакетам свои имена:

*Тыкни чтобы посмотреть картинку* / *Тыкни чтобы посмотреть картинку*

> Операторы break и continue могут принимать необязательную метку, чтобы указать, какую конструкцию завершить или продолжить (полезно когда надо пропустить итерацию внешнего цикла). В Go есть и goto, который можно использовать для того же, но его как то не любят.

> Операторы if и switch в Go могут принимать необязательный параметр инициализации. То есть по как в циклах в Си мы можем инициализировать переменную при объявлении цикла, так в Go мы можем инициализировать переменную при объявлении условия. И сразу проверить удовлетворяет она условию или нет.

*Тыкни чтобы посмотреть картинку* / *Тыкни чтобы посмотреть картинку*

> В switch нет fall through (автоматического перехода к следующему случаю). Т.е. не надо писать множество break'ов как в Си.

> В switch можно указать несколько значений для одного случая через запятую

*Тыкни чтобы посмотреть картинку*

> В Go есть тип Rune, представляющий из себя 1 Unicode символ.

> Оператор defer в Go откладывает выполнение функции (отложенной функции) до момента, когда вызывающая её функция завершится и начнёт возвращать результат. Так часто удобнее следить за освобождением ресурсов. К примеру: закрытие файла находится рядом с его открытием, что делает код более понятным, чем если бы закрытие было размещено в конце функции.

> В отличие от C , возвращать адрес локальной переменной в Go вполне допустимо; память, связанная с переменной, сохраняется после завершения функции.

> В Go есть похожая на enum штука, только более мощная. Нумерованный блок констант можно задать с помощью оператора iota.

*Тыкни чтобы посмотреть картинку*

> Каждый исходный файл может определить свою собственную функцию init без параметров, чтобы настроить всё необходимое состояние. init вызывается после того, как все объявления переменных в пакете инициализировали свои значения, а это происходит только после того, как все импортированные пакеты были инициализированы. Помимо инициализаций, распространённое использование функций init заключается в проверке или исправлении корректности состояния программы перед началом её реального выполнения.