How to Implement the Repository Pattern in Go

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.

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.