пакет с объектами, которые нуждаются в очистке

#go

#Вперед

Вопрос:

Я пытаюсь сгруппировать код моей базы данных в подпакет, который как бы инкапсулировал мое подключение к базе данных и все мои подготовленные инструкции.

Я могу создать подключение к базе данных и инструкции в init функции пакета, но в какой-то момент мне нужно их закрыть.

В программе, где эти переменные инициализированы в коде, который их использует, я бы использовал defer db.Close() и т.д., Но как это сделать здесь?

Я бы предпочел не предоставлять глобальные переменные пакета (connection и statements), чтобы вызывающий мог получить к ним доступ для их закрытия. Есть ли способ сделать это более элегантным способом?

Я подозреваю, что у меня может быть неправильная парадигма в виду, и я пытаюсь создавать объекты (по сути, это то, что здесь) на языке, в котором их нет. Если это так, то я был бы признателен за любую помощь в том, как это сделать по-быстрому.

 package database

import (
  "database/sql"
  _ "github.com/lib/pq"
)

var db *sql.DB
var stmtSelectUser *sql.Stmt

func GetUser(email string) string {
  var name string
  stmtSelectUser.QueryRow(email).Scan(amp;name)
  return name
}

func init() {
  var e error;
  db, e = sql.Open("postgres", "host=localhost dbname=pictocat sslmode=disable")
  stmtSelectUser, e = db.Prepare("select * from users where email='$1'")
}
  

Ответ №1:

Из вашего примера кода не совсем ясно, в чем ваша проблема, но в целом:

Либо функция, выполняющая инструкцию, должна завершить инструкцию и закрыть () ее, либо вам нужно добавить функцию в ваш пакет, чтобы вызывающий объект мог ее закрыть; все очень просто.

Вам не нужно предоставлять доступ ко всему содержимому базы данных в вашем пакете, достаточно функции, которая, в свою очередь, вызывает Close() .