如何使用Go接口

taigacute · 2019-06-22 13:55:44 · 812 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-06-22 13:55:44 的主题,其中的信息可能已经有所发展或是发生改变。

常见写法

经常看到许多人的写法

package animals 

type Animal interface {
    Speak() string
}

//实现animal这个接口
type Dog struct{}
func (a Dog) Speak() string { return "woof" }
package circus

import "animals"

func Perform(a animal.Animal) string { return a.Speak() }

这种写法很像java 风格,Java-style接口使用方式。解读上面的代码步骤

  • 定义了一个Animal的接口
  • 定义了一个Dog的结构体
  • Dog的结构体有一个方法为Speak,这样Dog这个结构体实现了Animal这个接口

以上写法可以概括为“编写类型以实现接口”。

  • 很明显它只有一种类型可以实现接口而没有明显的扩展方式。
  • 参数通常采用具体类型而不是接口类型。

更建议的写法

Go 的接口,不是编写类型来实现接口,而是编写接口满足需求。就拿上面的代码为例,不是在animals中定义Animal,而是在使用的位置来定义接口。

package animals

type Dog struct{}
func (a Dog) Speaks() string { return "woof" }
package circus

type Speaker interface {
    Speak() string
}

func Perform(a Speaker) string { return a.Speak() }
  • 定义类型
  • 在使用的位置定义接口

这种是方式减少了包animals 对组件的依赖。减少依赖可以有助于构建一个更强壮的程序。

Postel 定律

编写优秀软件的好准则之一Postel 定律。这个翻译有很多版本不同的环境都有不同的理解。贴原文

“Be conservative with what you do, be liberal with you accept”

在Go中的理解

接收接口,返回结构(Accept interfaces,return structs)

Go的谚语中,Rob pike 说过这样一句话

“the empty interface says nothing“ - Rob Pike

写go更多应该按照的go的思想 和行为来编写代码。而不是保持过多原有的思想。


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

812 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传