【发布时间】:2021-08-16 15:44:08
【问题描述】:
在Go中,如何使用另一个接口定义一个接口?
这是一个例子:
package main
import (
"fmt"
)
// Interfaces
type Message interface {
Read() string
}
type MessageReader interface {
ReceiveMessages([]Message)
}
// Structs
type SQSMessage struct {
Content string
}
type SQSMessageReader struct {
Name string
}
// Implements
func (reader *SQSMessageReader) ReceiveMessages([]SQSMessage) {
}
func (msg *SQSMessage) Read() string {
return msg.Content
}
// A function needs a reader interface
func FuncNeedsReader(MessageReader) {
fmt.Println("get reader")
}
func main() {
var reader SQSMessageReader
FuncNeedsReader(reader)
}
我收到错误:
./prog.go:40:17: cannot use reader (type SQSMessageReader) as type MessageReader in argument to FuncNeedsReader:
SQSMessageReader does not implement MessageReader (wrong type for ReceiveMessages method)
have ReceiveMessages([]SQSMessage)
want ReceiveMessages([]Message)
有谁知道这个设计是否与 Go 的设计冲突?
我知道我们有“接受接口,返回结构” 所以我也尝试了https://play.golang.org/p/qdGaKRYAqw7,但仍然失败并出现类似错误。
【问题讨论】:
-
注意错误信息。接口类型仍然是不同的类型,它们的使用对类型等价没有任何影响(因此不满足错误中的“拥有”和“想要”)。本质上,接口对类型系统的唯一影响是它创建了一个新的assignability rule。类型等价或深度转换没有更多的魔力。
标签: go