В спецификации языка Go нет жёстких требований к структуре директорий. Но команды, которые начинаются с go ..., например go get, в их текущей реализации работают только с репозиториями, где соблюдается ряд условий.
В репозитории обычно размещают не больше одного модуля, а в корневой директории этого модуля — файл go.mod.
В модуль включают один или несколько пакетов, и для каждого пакета создают свою директорию с файлами. Имя пакета должно быть идентично имени директории — для исполняемых приложений в исходных файлах достаточно внутреннего именования package main.
Команда go build, запущенная без аргументов, собирает пакет из файлов той директории, в которой вызвана, — это основное правило. Если вы пишете черновик или совсем маленький пакет, то вполне можете обойтись одной директорией.
Директория пакета может содержать поддиректории с другими пакетами. Например, в директории пакета net исходников стандартной библиотеки находится поддиректория http. Соответственно, их пути импорта — net и net/http. Файлы пакета net/http не могут использовать функции пакета net, не импортировав его, — и наоборот.
Директория cmd
В директорию cmd помещают пакеты исполняемых команд. Если вы откроете директорию с установленным Go, то в src/cmd вы найдёте, к примеру, пакеты команд go и gofmt.
Директория internal
В директории internal размещают внутренние пакеты проекта.
Из этой директории можно импортировать только в те пакеты, которые расположены в соседних директориях, то есть у соседей должен быть общий с internal родитель. Например, пакет /a/b/c/internal/d/e/f можно импортировать только из /a/b/c и /a/b/c/... и нельзя из /a/b/g.
Начиная с версии Go 1.4, пакеты internal нельзя импортировать во внешние репозитории. Это сделано для гранулированного доступа и «подчистки» API в большой базе кода. Например, в директории net/internal в исходниках Go лежит непубличный пакет socktest, функции которого используют пакеты net/http и net/http/httputil.
Если вы опубликуете свой проект на GitHub, учитывайте, что пакеты из директории internal не будут доступны для импорта в другие Go-проекты.
Директория vendor
В корневой директории модуля иногда создают поддиректорию vendor и сохраняют туда локальные копии зависимостей. Копии нужны для того, чтобы обезопасить свой проект от удаления или некачественной поддержки внешних библиотек. Если внешние репозитории вдруг станут недоступны, это не вызовет проблем при сборке проекта.
Курс построен так, чтобы, кроме стандартной библиотеки, вы обходились минимумом зависимостей и использовали только надёжные. Поэтому директория vendor в задачах курса вам не понадобится. И всё же, чтобы попрактиковаться, вы можете воспользоваться командой go mod vendor и создать такую директорию.