我写了一个示例代码来了解未导出的 接口是如何工作的。在下面的示例中,我在服务包中声明了未导出的repoInterface 。
repo包中的TestRepo结构实现了未导出的 repoInterface,没有任何问题。
Code structure
repo
repo.go
service
service.go
main.go
服务.go
// service/service.go
// this is the interface which the TestRepo struct implements in repo package
type repoInterface interface{
GetName() string
}
type TestService struct{
repo repoInterface
}
func NewTestService(r repoInterface) TestService {
return TestService{
repo: r,
}
}
func (s TestService) GetName() string {
return s.repo.GetName()
}
回购/repo.go
// repo/repo.go
type TestRepo struct{
name string
}
func NewTestRepo(name string) TestRepo {
return TestRepo{
name: name,
}
}
// implements repoInterface present in service package
func (r TestRepo) GetName() string {
return r.name
}
main.go
func main() {
testRepo := repo.NewTestRepo("hello")
testService := service.NewTestService(testRepo)
fmt.Println(testService.GetName())
}
// Output
// hello
到目前为止我的假设:
这是不可能的,因为 repo 和 service 是不同的包。
repo 包中存在的 TestRepo 结构无法实现服务包中存在的 Unexported 接口。这就是我们导出接口的原因。
现在我意识到这不是真的,我的理解是错误的。
问题:
为什么 Go 允许实现存在于不同包中的未导出接口?