【发布时间】:2021-02-10 02:03:36
【问题描述】:
- 我有一个接口,它嵌入到多个结构中 形成一个装饰器模式。
- 现在我添加了代码以将
Validator和APIService类型转换到API 接口。因此,如果我在界面中添加一个函数,那么我应该能够将其添加到Validator和APIService。
但这段代码似乎可以编译。
我应该得到一个编译器错误,因为我没有在 Validator 上实现 Get
如果我从 APIService 中删除 Get,我会收到一条错误消息,提示我无法将 *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
但如果我在APIService 上评论Get 函数,我会得到以下有效的错误:
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)
我之前应该遇到编译器错误,并且我还没有在 Validator 上实现 Get
如果我从APIService 中删除Get,我会收到一条错误消息,提示我无法将*APIService 类型转换为API,因为get 没有实现。
【问题讨论】:
-
您选择通过嵌入接口来定义方法,这意味着它将满足类型断言。在 nil 接口上调用方法是运行时错误,而不是编译时错误。
-
导入行后面的代码。
var _ API = (*Validator)(nil)这条线应该失败了吧? -
@DineshGowda 不,
Validator类型满足使用从字段API提升的Get方法的接口。
标签: go interface casting type-assertion