在 Go 中嵌入接口的类型断言

Type assertions with interface embedding in Go

但是这段代码似乎可以编译。 我应该遇到编译器错误,因为我没有在 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