# #go #visual-studio-code #go-structtag
Вопрос:
Я работаю над проектом Go со структурой, такой как эта:
pages (folder)
-> faculty (folder)
> instructors.go
> professors.go
generalpages.go (inside pages folder)
generalpages.go
обрабатывает мою Repository
структуру шаблона со следующим объявлением:
type Repository struct {
App *config.AppConfig
}
Все общие страницы (например, «Главная», «О компании») работают правильно, имея этот тип декларации:
func (m *Repository) AboutPage(w http.ResponseWriter, r *http.Request) {
// some functionality
}
Однако, если я хочу структурировать свои страницы и использовать для своего InstructorsPage
(внутреннего instructor.go
) объявления следующее, это не работает, и ошибка в VSCode говорит: undeclared name
.
Я понимаю, что объект должен быть виден в одном и том же пакете, но все равно это не работает. go build
не выдает никаких ошибок, но когда я использую пакет маршрутизации ( chi
), он не может правильно ссылаться на него.
Комментарии:
1. папка не всегда является пакетом. пожалуйста, укажите пакеты в первой строке вашего файла.
2. компилятор выдаст ошибку, если имя пакета не указано в первой строке. конечно, одно и то же имя пакета указано в одной и той же папке.
3. Вложенная папка-это другой пакет.
4.golang.org/ref/spec#Method_declarations
A receiver base type cannot be a pointer or interface type and it must be defined in the same package as the method.
Ответ №1:
Пакеты Go так не работают.
Если ваша структура каталогов:
moduleRootDir
parentDir
subDir
и если оба каталога определяют имя пакета pkg
, то это два разных пакета.
Если имя модуля равно module
, то путь импорта для пакета в родительском каталоге равен module/pkg
, а пакет в поддиапазоне равен module/pkg/pkg
. Чтобы использовать имена, определенные в поддиапазоне, импортируйте его в файлы go в родительском каталоге:
package pkg
import (
subpkg "module/pkg/pkg"
)
Затем вы можете получить к ним доступ с помощью subpkg.SymbolName
.