我认为解释这个问题的最好方法是举例,所以这里是:
for(var i in results)
{
console.log(results[i].email);
}
这会打印package main
import (
"fmt"
)
// Greeter greets with a Greeting.
type Greeter interface {
Greet() Greeting
}
// A Greeting has a string representation.
type Greeting interface {
String() string
}
type Hello struct {}
// Hello greets by returning itself...
func (h *Hello) Greet() *Hello {
return h
}
// ...because Hello also has a string representation.
func (h *Hello) String() string {
return "Hello"
}
// But Go says Hello doesn't implement Greeter.
func main() {
var g interface{} = &Hello{}
g, ok := g.(Greeter)
fmt.Println(ok)
}
。你可以运行和玩它:https://play.golang.org/p/A_2k_ku_Q2
在我的实际案例中,结构false
以及Hello
和Greeter
的界面位于不同的包中,不会相互导入,我想保持这种方式。我可能在Go中忽略了对接口的一些理解,但在阅读了很多关于它的内容之后,我仍然无法指责它。你们能为我指点什么吗?也许这个问题的另一种方法?谢谢!
答案 0 :(得分:10)
正如评论中所述,这里的问题是你的界面有了这个签名:
type Greeter interface {
Greet() Greeting
}
任何有效的实现都必须使用Greeting
作为返回类型。
但是,正如文档所示,您不需要为界面指定名称:
为了能够实现您所需要的,您可以直接在返回值中声明接口,而不为其命名。
// Greeter greets with anything that has a String() method
type Greeter interface {
Greet() interface{ String() string }
}
然后Greet()
的{{1}}功能可以执行此操作:
Hello
在这里找到一个修改过的游乐场,展示了工作示例: