传递与指定类型不同的参数类型在 Golang 中有效吗?
Passing in a different parameter type than the one specified works in Golang?
我总共有 3 个包:repository、restrict 和 main。
在我的存储库包中,我有一个名为 "RestrictionRuleRepository" 的结构,定义为:
type RestrictionRuleRepository struct {
storage map[string]float64
}
在另一个包 restrict 中,我定义了一个 "NewService" 函数:
func NewService(repository rule.Repository) Service {
return &service{
repository: repository,
}
}
最后,在我的 main 包中,有这两行代码:
ruleRepo := repository.RestrictionRuleRepository{}
restrictionService := restrict.NewService(&ruleRepo)
我的代码编译没有任何错误。为什么在 Golang 中允许这样做?我的 NewService 函数不需要 Repository 类型,但我将 RestrictionRuleRepository 结构的地址传递给它吗?
很可能 rule.Repository
是一个接口,而 *RestrictionRuleRepository
类型恰好实现了该接口。
这是一个例子:
package main
import (
"fmt"
)
type Repository interface {
SayHi()
}
type RestrictionRuleRepository struct {
storage map[string]float64
}
func (r *RestrictionRuleRepository) SayHi() {
fmt.Println("Hi!")
}
type service struct {
repository Repository
}
type Service interface {
MakeRepoSayHi()
}
func NewService(repository Repository) Service {
return &service{
repository: repository,
}
}
func (s *service) MakeRepoSayHi() {
s.repository.SayHi()
}
func main() {
ruleRepo := RestrictionRuleRepository{}
restrictionService := NewService(&ruleRepo)
restrictionService.MakeRepoSayHi()
}
正如您在 https://play.golang.org/p/bjKYZLiVKCh.
中所见,编译效果很好
我还推荐 https://tour.golang.org/methods/9 作为界面入门的好地方。
我总共有 3 个包:repository、restrict 和 main。
在我的存储库包中,我有一个名为 "RestrictionRuleRepository" 的结构,定义为:
type RestrictionRuleRepository struct {
storage map[string]float64
}
在另一个包 restrict 中,我定义了一个 "NewService" 函数:
func NewService(repository rule.Repository) Service {
return &service{
repository: repository,
}
}
最后,在我的 main 包中,有这两行代码:
ruleRepo := repository.RestrictionRuleRepository{}
restrictionService := restrict.NewService(&ruleRepo)
我的代码编译没有任何错误。为什么在 Golang 中允许这样做?我的 NewService 函数不需要 Repository 类型,但我将 RestrictionRuleRepository 结构的地址传递给它吗?
很可能 rule.Repository
是一个接口,而 *RestrictionRuleRepository
类型恰好实现了该接口。
这是一个例子:
package main
import (
"fmt"
)
type Repository interface {
SayHi()
}
type RestrictionRuleRepository struct {
storage map[string]float64
}
func (r *RestrictionRuleRepository) SayHi() {
fmt.Println("Hi!")
}
type service struct {
repository Repository
}
type Service interface {
MakeRepoSayHi()
}
func NewService(repository Repository) Service {
return &service{
repository: repository,
}
}
func (s *service) MakeRepoSayHi() {
s.repository.SayHi()
}
func main() {
ruleRepo := RestrictionRuleRepository{}
restrictionService := NewService(&ruleRepo)
restrictionService.MakeRepoSayHi()
}
正如您在 https://play.golang.org/p/bjKYZLiVKCh.
中所见,编译效果很好我还推荐 https://tour.golang.org/methods/9 作为界面入门的好地方。