专栏名称: 狗厂
目录
相关文章推荐
51好读  ›  专栏  ›  狗厂

Go编程技巧之“延后抽象”

狗厂  · 掘金  ·  · 2018-04-20 02:24

正文

鲁迅曾经说过,复杂的问题都能用增加一层抽象来解决。(鲁迅: 我特么没说过!)

在实际工程中,为了解耦,可能需要定义大量的接口。

如在用户管理系统中,可能含有一个像根据用户名检索用户的 服务 UserSearcher:

type UserSearcher interface{
  Search(name string)([]*User,error)
}

一般情况下在项目初期,只有一个基于数据库的 实现 ——*DBUserSearcher。

type DBUserSearcher struct{}
func (*DBUserSearcher) Search(name string)(users []*User,err error){
  return 
}

如此这样,如果有几十个服务,可能就要定义几十个接口,毕竟随时可能替换具体实现,避免改动对整个系统造成的冲击。然而百分之九十的情况之下,像这些的接口在软件整个生命中都只存在一种实现,代码量的膨胀显然带来的收益很小。

而在项目刚启动的时候,接口的定义往往改动很频繁,这时候不仅仅需要在接口定义上修改,还要去接口实现的类型上进行修改,这样就会非常痛苦,很不灵活。

如果这些困扰也曾让您烦恼过,那么接下来,我介绍的这一种我称之为 “延后抽象” 的技巧就能够帮助您减轻很大一部分痛苦。

在Go的 1.9版本以上 ,利用 类型别名 的特性,结合golang接口的 鸭子类型 特点:







请到「今天看啥」查看全文