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

问题描述

  • 我有一个接口,它被嵌入到多个结构中 形成装饰图案。
  • 现在,我已经添加代码,以将ValidatorAPIService类型转换到API接口。这样,如果我在接口上添加一个函数,那么我应该能够在ValidatorAPIService添加它。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...