问题描述
- 我有一个接口,它被嵌入到多个结构中 形成装饰图案。
- 现在,我已经添加了代码,以将
Validator
和APIService
类型转换到API接口。这样,如果我在接口上添加了一个函数,那么我应该能够在Validator
和APIService
处添加它。
但是此代码似乎可以编译。
我应该有一个编译器错误,因为我没有在Get
上实现Validator
如果我从Get
中删除APIService
,则会收到一条错误消息,提示我无法将*APIService
转换为API
,因为未实现get。 >
package main
import "fmt"
type API interface {
Get()
}
var _ API = (*Validator)(nil)
var _ API = (*APIService)(nil)
type APIService struct {
id string
}
type Validator struct {
API
}
type APIRouter struct {
API
}
func(a *APIService) Get(){
fmt.Println("Calling Get api on APIService")
}
func NewAPIRouter() *APIRouter{
return &APIRouter{
API: &Validator{
API: &APIService{
},},}
}
func main() {
var api API = NewAPIRouter()
api.Get()
}
如果我编译上面的代码:
./main
Calling Get api on APIService
但是,如果我在Get
上评论APIService
函数,则会得到以下有效的错误:
go build
# main
./main.go:9:5: cannot use (*APIService)(nil) (type *APIService) as type API in assignment:
*APIService does not implement API (missing Get method)
在Get
上未实现Validator
之前,我应该有一个编译器错误
如果我从Get
中删除APIService
,则会收到一条错误消息,提示我无法将*APIService
转换为API
,因为未实现get。 >
解决方法
类型APIService
是带有方法Get
的结构,因此它实现了API
接口。
类型Validator
是具有嵌入式接口API
的结构。这意味着Validator
实例具有实现API
接口的嵌入式成员,并且由于是嵌入式的,Validator
也实现了API
接口。但是,请注意,您必须首先将Validator.API
初始化为实现。这样的事情应该起作用:
v:=Validator{API:&APIService{}}
这样,v.Get()
将调用嵌入的APIService.Get
。