The Repository Pattern in Go is implemented by defining an interface for data operations and a concrete struct that implements it to separate business logic from data access. Create an interface in your domain package, then implement it in a separate repository package using your chosen data source.
// domain/user.go
type UserRepository interface {
GetByID(id int) (*User, error)
Save(u *User) error
}
// repo/user_repo.go
type UserRepo struct {
db *sql.DB
}
func (r *UserRepo) GetByID(id int) (*User, error) {
var u User
err := r.db.QueryRow("SELECT * FROM users WHERE id = ?", id).Scan(&u.ID, &u.Name)
if err != nil { return nil, err }
return &u, nil
}
func (r *UserRepo) Save(u *User) error {
_, err := r.db.Exec("INSERT INTO users (name) VALUES (?)", u.Name)
return err
}