Implement the Repository Pattern in Go by defining an interface for data operations and creating a struct that implements it to interact with your data source.
// Define the interface
//go:generate mockgen -source=repository.go -destination=mock_repository.go -package=mocks
type UserRepository interface {
GetByID(id int) (*User, error)
Save(user *User) error
}
// Define the concrete implementation
type userRepository struct {
db *sql.DB
}
func NewUserRepository(db *sql.DB) UserRepository {
return &userRepository{db: db}
}
func (r *userRepository) GetByID(id int) (*User, error) {
var user User
err := r.db.QueryRow("SELECT * FROM users WHERE id = $1", id).Scan(&user.ID, &user.Name)
if err != nil {
return nil, err
}
return &user, nil
}
func (r *userRepository) Save(user *User) error {
_, err := r.db.Exec("INSERT INTO users (name) VALUES ($1)", user.Name)
return err
}
Use the interface in your service layer to decouple business logic from data access details.