go - 在 Go 中嵌入接口的类型断言
问题描述
- 我有一个接口,它嵌入到形成装饰器模式的多个结构中。
- 现在,我已将代码添加到类型转换
Validator
和APIService
API 接口中。因此,如果我向界面添加一个函数,那么我应该能够在Validator
and处添加它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
.
推荐阅读
- css - 导入 CSS 变量无法识别
- typescript - 扩展泛型函数参数类型 - Typescript
- r - 为特定行赋值 (R)
- bash - 如何使用bash comm获取目录A而不是B中的文件,反之亦然?
- vaadin8 - vaadin 8 中 setLogoutURL 方法的替代品是什么
- html - 我在我的网站上收到响应错误,我该怎么办?
- excel - 从另一个应用程序运行 excel 宏时的 Range.copy 问题
- excel - 改进 VBA 过滤数据透视表字段与当前月份 + 月份到年底
- bash - mailx - 使用 mailx 发送文本文件时行不中断
- reactjs - 当 app.tsx 中的属性更改时通知 _app.js