在Go中我可以返回一个符合接口的结构而无法访问该接口吗?

时间:2017-08-05 21:12:42

标签: go interface

我认为解释这个问题的最好方法是举例,所以这里是:

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以及HelloGreeter的界面位于不同的包中,不会相互导入,我想保持这种方式。我可能在Go中忽略了对接口的一些理解,但在阅读了很多关于它的内容之后,我仍然无法指责它。你们能为我指点什么吗?也许这个问题的另一种方法?谢谢!

1 个答案:

答案 0 :(得分:10)

正如评论中所述,这里的问题是你的界面有了这个签名:

type Greeter interface {
    Greet() Greeting
}

任何有效的实现都必须使用Greeting作为返回类型。

但是,正如文档所示,您不需要为界面指定名称:

enter image description here

为了能够实现您所需要的,您可以直接在返回值中声明接口,而不为其命名。

// Greeter greets with anything that has a String() method
type Greeter interface {
    Greet() interface{ String() string }
}

然后Greet()的{​​{1}}功能可以执行此操作:

Hello

在这里找到一个修改过的游乐场,展示了工作示例:

https://golang.org/ref/spec#Interface_types