首页 > 解决方案 > 在 Go 中嵌入接口的类型断言

问题描述

但是这段代码似乎可以编译。 我应该有一个编译器错误,因为我还没有实现Get如果Validator 我从中删除GetAPIService我得到一个错误,说我不能类型转换到*APIServiceAPI因为 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 我从中删除GetAPIService我得到一个错误,说我不能类型转换为*APIServiceAPI因为 get 没有实现。

标签: gointerfacecastingtype-assertion

解决方案


该类型APIService是一个带有方法的结构Get,因此它实现了API接口。

该类型Validator是具有嵌入式接口的结构API。这意味着,一个Validator实例有一个实现API接口的嵌入成员,并且因为它是嵌入的,所以Validator也实现了API接口。但是,请注意,您必须首先初始化Validator.API为实现。像这样的东西应该工作:

v:=Validator{API:&APIService{}}

有了这个,v.Get()将调用嵌入式APIService.Get.


推荐阅读