在 Go 中嵌入接口的类型断言
Type assertions with interface embedding in Go
- 我有一个接口,它被嵌入到多个结构中
形成装饰器模式。
- 现在我添加了代码以将
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
[=52= 上实现 Get
]
如果我从 APIService
中删除 Get
,我会收到一条错误消息,提示我无法将 *APIService
类型转换为 API
,因为未实现 get。
类型 APIService
是具有方法 Get
的结构,因此它实现了 API
接口。
类型 Validator
是一个具有嵌入式接口的结构 API
。这意味着,一个 Validator
实例有一个实现 API
接口的嵌入成员,并且由于它是嵌入的,Validator
也实现了 API
接口。但是,请注意,您必须先将 Validator.API
初始化为一个实现。这样的事情应该有效:
v:=Validator{API:&APIService{}}
这样,v.Get()
将调用嵌入的 APIService.Get
。
- 我有一个接口,它被嵌入到多个结构中 形成装饰器模式。
- 现在我添加了代码以将
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
[=52= 上实现 Get
]
如果我从 APIService
中删除 Get
,我会收到一条错误消息,提示我无法将 *APIService
类型转换为 API
,因为未实现 get。
类型 APIService
是具有方法 Get
的结构,因此它实现了 API
接口。
类型 Validator
是一个具有嵌入式接口的结构 API
。这意味着,一个 Validator
实例有一个实现 API
接口的嵌入成员,并且由于它是嵌入的,Validator
也实现了 API
接口。但是,请注意,您必须先将 Validator.API
初始化为一个实现。这样的事情应该有效:
v:=Validator{API:&APIService{}}
这样,v.Get()
将调用嵌入的 APIService.Get
。