How to Build a Repository Pattern in Go

Implement the Repository Pattern in Go by defining an interface for data operations and a concrete struct to separate business logic from data access.

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
}