Go — структура не видна в том же пакете, но во вложенной папке

# #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 .