正文
鲁迅曾经说过,复杂的问题都能用增加一层抽象来解决。(鲁迅: 我特么没说过!)
在实际工程中,为了解耦,可能需要定义大量的接口。
如在用户管理系统中,可能含有一个像根据用户名检索用户的
服务
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接口的
鸭子类型
特点: