Не знаю, какая у вас архитектура, но когда какая-то библиотека обрастает огромным количеством методов, то Go - это один из редких языков программирования, который, благодаря своей утиной типизации позволяет использовать шаблон проектирования "consumer interfaces", т.е. объявлять интерфейсы в месте, где они используются и включать в эти интерфейсы только те методы из огромной структуры базы данных, которые именно тут, на месте, и используются. Таким образом ваши интерфейсы будут минимальными, понятными, и искать их не придётся. Ну, и в добавок, старый добрый Dependency Injection решит массу наших проблем
База данных:
package db
import "fmt"
// Стуктура базы данных. Здесь нам даже и не нужно объявлять никаких интерфейсов
type Service struct {
// ...
}
func NewDbService() (*Service, error) {
return &Service{}, nil
}
func (d *Service) CreateUser(username string, email string) {
fmt.Println(fmt.Sprintf("user %s with email %s is created", username, email))
}
func (d *Service) CreateProduct(name string) {
fmt.Println(fmt.Sprintf("product %s is created", name))
}
Пользователь:
package user
// Тот самый интерфейс, который нам позволяет выбрать из структуры базы данных
// только нужные нам здесь методы
type dbUser interface {
CreateUser(username string, email string)
}
type Service struct {
db dbUser
// ...
}
func NewService(db dbUser) (*Service, error) {
return &Service{db}, nil
}
func (c *Service) New(username string, email string) {
c.db.CreateUser(username, email)
}
Товар:
package product
// Тот самый интерфейс, который нам позволяет выбрать из структуры базы данных
// только нужные нам здесь методы
type dbProduct interface {
CreateProduct(name string)
}
type Service struct {
db dbProduct
// ...
}
func NewService(db dbProduct) (*Service, error) {
return &Service{db}, nil
}
func (p *Service) New(name string) {
p.db.CreateProduct(name)
}
main.go
package main
import (
"test2/db"
"test2/product"
"test2/user"
)
func main() {
// Инициализируем базу данных
dbService, _ := db.NewDbService()
// Структура базы данных реализует интерфейс dbProduct, инжектим её
productService, _ := product.NewService(dbService)
// Структура базы данных реализует интерфейс dbUser, инжектим её
userService, _ := user.NewService(dbService)
// Пользуемся на здоровье...
userService.New("user1", "uswr1@example.com")
productService.New("product1")
}