В настоящее время я пытаюсь работать над небольшим проектом Go, и у меня есть проблема, которую я пытаюсь решить.
В настоящее время я использую github.com/jinzhu/gorm для обработки операций с базой данных для бэкэнда сервера GraphQL, и я хотел иметь возможность хранить соединение с БД в глобальной переменной, доступной для всего проекта (включая подпакеты).
Моя первая попытка заключалась в создании переменной с именем db, выполнив в моем файле main.go следующее:
var db *gorm.DB
var err error
затем внутри функции init():
func init() {
db, err = gorm.Open("postgres", "credential stuff here")
db.AutoMigrate(&modelStructHere)
defer db.Close()
}
Никаких сбоев нет, но я предполагаю, что из-за области видимости переменная db может использоваться только внутри main.go, но мне также нужно иметь возможность использовать ее внутри gql/gql.go, где в настоящее время находится мой преобразователь GraphQL.
Возможно, мне следует переместить этот фрагмент кода (инициализацию БД) в фактический файл преобразователя, поскольку в любом случае операции с БД не используются, так что, может быть, проблема в этом?
Заранее спасибо!

Комментарий Алекса уместен. Создайте папку с именем «база данных» и поместите внутрь файл с именем «database.go», содержащий следующее:
package database
// the imports go here
var DB *gorm.DB
Теперь вы можете использовать его где угодно с database.DB. Не следует делать переменную ошибки глобальной, обрабатывать ее в той же функции, которая инициализирует БД. Функция init может находиться в любом месте, обычно вы хотите, чтобы она находилась в начале вашей программы в основной функции.
Переместите его в другой пакет и сделайте его заглавным
var DB *gorm.DB. Затем вы можете импортировать его куда угодно. Проблема с тем, как вы это делаете сейчас, заключается в том, чтоgql.goне может импортировать из main, потому что это будет цикл зависимости. Перенос его в другой неосновной пакет удаляет цикл.