In one package I have an interface Repository
that has a method GetReporter
that returns an interface Reporter
. This is used by a function Execute
that takes a Repository
and gets its Reporter
via the GetReporter
function.
In another package I have a struct GithubRepository
that has a method GetReporter
that returns a GithubReporter
.
In a third package I want to call the Execute
function out of package #1 with a GithubRepository
instance.
I am trying to have package 1 and 2 independent of each other, without one importing something from the other. The 3rd package should combine the first two.
Golang returns:
cannot use githubRepository (type GithubRepository) as type Repository in argument to Execute:
GithubRepository does not implement Repository (wrong type for GetReporter method)
have GetReporter(string) GithubReporter
want GetReporter(string) Reporter
Code:
package main
// Package #1
type Repository interface {
GetReporter(string) Reporter
}
type Reporter interface {
ChangeStatus(string) error
}
func Execute(r Repository) {
// Do something with the repository
}
// Package #2
type GithubRepository struct {
}
type GithubReporter struct {
}
func (repo *GithubRepository) GetReporter(sha string) GithubReporter {
return GithubReporter{}
}
func (reporter *GithubReporter) ChangeStatus(status string) error {
// Change the status
return nil
}
// Package #3
func main() {
githubRepository := GithubRepository{}
Execute(githubRepository)
}
Go Playground: https://play.golang.org/p/ph0sZnyAC5I