Комментарии 9
https://habr.com/ru/articles/771858/?ysclid=mrdcn1ly1q112340934
Init() не приветсвуется
go 1.25.3
Сам изучал да писал или несвежий текст скопипастил?
├── main.go <-- Go файл корневого пакета├── fmt/ <-- Пакет fmt│ └── printer.go <-- Go файл пакета fmt
Стандартную библиотеку переписывать кто подучил? Какой такой гипотетический бред? Сами хотите запутаться - отлично, но держите такое не на виду.
Оставим данный вариант импорта просто для некого "знания", что такой способ когда-то использовался, сейчас, вероятно, из-за того, что большинство проектов пишутся в модульном варианте такой способ не используется.
ЧТО ЗНАЧИТ ВЕРОЯТНО?! Какой такой вариант импорта? Импорт в Go всегда один и тот же, а вот режимов поиска два - режим модуля и режим GOPATH. И оба, как это ни сложно себе представить после долгтх лет копипасты на Python и JavaScript, используются оба.
Поэтому я решил устроить эксперимент и разбирать Go прямо в публичном поле, шаг за шагом документируя весь процесс.
Идея прекрасная, а процесс дурацкий.
Я возьму за основу официальный трек обучения от создателей языка и постараюсь подробно разобрать как Go устроен.
Наверно дело как раз в этом. То, что Вы приняли за трек обучения, это никакой не трек, никакого обучения от него не будет, это tour, то есть экскурсионная развлекательная поездка. Её задача - дать тому, кому Go не зайдёт, возможность почувствовать это как можно раньше. А тому, кому зайдёт, возможность в этом убедиться тоже как можно раньше, что-то в процессе написав, глупо или нет - пока не важно.
Переписывать такое своими словами - цензурных слов у меня нет. Но напомню, я писал - идея прекрасная. Потому, что на сайте Go недавно произошла катастрфа, последовательная документация уровня одновременно доступного и достаточного для изучения - исчезла, вместо неё трудно читаемая reference и другие, в смысле кроме tour, весёлые истории.
Я могу понять это двумя способами. Первый, от разглядывания страницы https://go.dev/learn/ - это чтобы лучше продовались курсы и книжки, нет причин выкладывать бесплатно то, что есть надежда продать. Второй, от желания оправдать дьявола - это потому, что набор рассказов по поводу достаточен для освоения чтения reference, которому всякому не мечтающему о статусе вечного джуна, особенно внезапно не вечного в силу ИИ, всё равно придётся придаться.
Разбираться с Go нужно с ввода
go help
go help environment
go help run
go help packages
go help modules
go help modules-auth
go help buildПосле чего можно или продолжить изучение, или написать о том, о чём в статье и написано, только совсем иначе. Без такого вот
Значит, можно сказать, что пакет - это атомарная, неделимая единица компиляции. Именно то, что компилируются вместе в единый неделимый блок,
ибо так сказать можно только с целью опозориться, ибо неделимая единица компиляции в Go, кто бы мог подумать, есть файл.
А лучше - начинать не с того, какая там "структура проекта", а как выполнить код на Go. Когда он в одном файле. Или в трёх. А случай когда в тысяче, вместе со структурой проекта, отложить на потом. Ну, разве что упомянуть почему зависимости структуре проекта ортогональны.
Здравствуйте, спасибо за ваш комментарий!
Сам изучал да писал или несвежий текст скопипастил?
Изучал самостоятельно. Пример go.mod взят с моего локального проекта, а прописанная в нем версия go никак не говорит о копипасте.
Стандартную библиотеку переписывать кто подучил? Какой такой гипотетический бред? Сами хотите запутаться - отлично, но держите такое не на виду.
Как я прямо указал в тексте, переписыванием стандартных библиотек никто не занимался. Цель этой схемы - наглядно показать как устроена физическая вложенность папок и пути импортов на диске. Если она показалась Вам запутанной, это ваше право, но техническую суть работы путей компилятора пример передает точно.
ЧТО ЗНАЧИТ ВЕРОЯТНО?! Какой такой вариант импорта? Импорт в Go всегда один и тот же, а вот режимов поиска два - режим модуля и режим GOPATH. И оба, как это ни сложно себе представить после долгтх лет копипасты на Python и JavaScript, используются оба.
"Вероятно" - это значит, что довод может не являться истиной, а служит лишь выводом, к которому пришел автор в конкретном блоке статьи.
"Вариант импорта" - значит вариант написания импорта. Про режим поиска в статье не было упомянуто, спасибо за дополнение.
Идея прекрасная, а процесс дурацкий.
Далее вы поднимаете тему о "неверности" выбора пути, по которому я пошел. Начиная от выбора источника направления изучения, заканчивая структурой и примерами.
В самом начале статьи я четко обозначил формат: это мой интерактивный личный учебник, а не академическое пособие. Здесь я описываю то, с чем мне было интересно познакомиться в процессе изучения, особенности языка и то, в каком порядке я бы их поставил. Заметьте, везде я использую слово "Я" и не говорю, что такая структура и такой подход - единственно правильные.
Этим я хочу сказать, что "истинного" подхода к изучению нет, особенно в формате таких статей. Это как давний спор, с какого языка программирования "правильнее" начинать.
То, что Вы приняли за трек обучения, это никакой не трек, никакого обучения от него не будет, это tour, то есть экскурсионная развлекательная поездка. Её задача - дать тому, кому Go не зайдёт, возможность почувствовать это как можно раньше
Я посчитал tour структурированным и простым подходом к изучению. Да, действительно, он не подходит для глубокого изучения, но взять его как основу никто не запрещает, тем более я не останавливался на поверхностном изучении глав тура.
ибо неделимая единица компиляции в Go, кто бы мог подумать, есть файл.
В языке C/C++ single compilation unit - это, действительно, файл.
Но в Go - это пакет согласно официальной документации компилятора и обсуждениям.
Если у вас есть иные архитектурные источники, утверждающие обратное, буду рад с ними ознакомиться.
Но в Go - это пакет согласно официальной документации компилятора и обсуждениям.
В этом месте я внезапно понял где же имнно мы фундаментально расходимся. Для Вас обсуждения - не пустой звук, как для меня, как альтернатива - бред, я привык к этому слову, хотя сейчас можно сказать красивее - галлюцинации. Для Вас документация в виде текста - Истина, для меня - третья, в лучшем случае - вторая, в исключительных случаях типа Rust - первая, но тень Истины. А Истина - это то, что выводится в терминал. Вам нужны источники - мне они интересны, иногда полезны, но никогда не нужны.
Go run делает исполняемый файл из одного файла? Делает. На этом, вообще-то, дискуссия может и закончиться. А может и нет, если недоумевающий заметит - но ведь в этом файле явно написано package main, это же пакет. Так вот, этот main, сколько ни пиши перед ним package, это не пакет, это команда. Об этом даже написано, если правильно помню, в go help, подкоманду не помню. Был бы пакет - его бы импортировали в другие пакеты...
В документации, например, написано, что файлы для go run должны быть в одной папке. А по жизни вовсе и нет, ибо go run следует символическим ссылкам. На практике, помнится, go run со ссылками идеально подходит для обучения, осбенно пока часты "сначала попробую так, а потом эдак и ещё через задницу непременно", а документация тупо портит experience путаясь под ногами.
Этим я хочу сказать, что "истинного" подхода к изучению нет, особенно в формате таких статей. Это как давний спор, с какого языка программирования "правильнее" начинать.
А вот это фундаментально. Да, люди отличаются целями и способностями, единого истинного (почему в кавычках, чего тут стесняться?) подхода нет. Но стоит отсечь по способностям на достаточно высоком уровне и хотя бы примерно определиться с целями, как истинный подход немедленно появляется, просто потому, что разумных подходов мало.
Абсолютно аналогично, тут Вы правы, и с языком с которого правильнее начинать. В отличии от подходов к обучению, языков много, что позволяет заметить, что отсутствие самого правильного, в том числе в силу размытия критериев, не исключает наличия отношений "всегда лучше" и "заведомо хуже", пусть и не между любой парой языков.
В самом начале статьи я четко обозначил формат: это мой интерактивный личный учебник, а не академическое пособие.
На 100% личного в публичном поле не бывает и никакая "личностность" право творить что угодно не даёт. Ещё в далёком прошлом врачи это сформулировали как принцип "не навреди".
В самих Go-файлах при объявлении пакета нужно писать только название текущего каталога.
Таки нет, это не так. В общем случае пакет будет иметь то же имя, что и каталог, в котором он расположен. Но можно назвать и иначе. Например, пакет, расположенный в директории cmd/app с вероятностью 0.999 будет иметь имя main.
Я , кстати, когда начинал, то именовать каталог по пакету приходилось в ручную. А сейчас заметил толи тулзы гошные, толи IDE при переименовании пакета каталог переименуют тоже.
НО так то да: имя пакета не обязано совпадать с именем папки.
Да, вы абсолютно правы, спасибо за это важное уточнение! Действительно, жесткой связи на уровне компилятора нет, и имя пакета определяется строго инструкцией package.

Go подробно! Часть 1. Структура проекта