Глобальные переменные и Go

В настоящее время я пытаюсь работать над небольшим проектом 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.

Возможно, мне следует переместить этот фрагмент кода (инициализацию БД) в фактический файл преобразователя, поскольку в любом случае операции с БД не используются, так что, может быть, проблема в этом?

Заранее спасибо!

Переместите его в другой пакет и сделайте его заглавным var DB *gorm.DB. Затем вы можете импортировать его куда угодно. Проблема с тем, как вы это делаете сейчас, заключается в том, что gql.go не может импортировать из main, потому что это будет цикл зависимости. Перенос его в другой неосновной пакет удаляет цикл.

Alex Guerra 13.07.2018 22:02
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
1
239
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Комментарий Алекса уместен. Создайте папку с именем «база данных» и поместите внутрь файл с именем «database.go», содержащий следующее:

package database
// the imports go here
var DB *gorm.DB

Теперь вы можете использовать его где угодно с database.DB. Не следует делать переменную ошибки глобальной, обрабатывать ее в той же функции, которая инициализирует БД. Функция init может находиться в любом месте, обычно вы хотите, чтобы она находилась в начале вашей программы в основной функции.

Другие вопросы по теме