写在前面

最近一段时间的工作主要以业务逻辑编写为主,重度使用了一些Go的框架,比如Web框架Gin、ORM框架GORM、模板渲染框架Simplate等等。在高强度的情况下编写高复杂度的代码,难免会遇到各种坑,自然而然地也会积累很多宝贵的经验,这些经验是我个人比较看重的,因此总乐意花一些时间总结。

上一篇博客写了在GROM中使用不定参数的技巧,有朋友私信询问,于是感觉有必要基于上一篇内容再续一篇把这个点讲透彻。

适应人群

入门√——初级——中级——高级;本文适应入门及以上。

GORM最佳实践之不定参数的用法(二)

再看GROM中不定参数的最佳实践

承接上一篇博客,看下面的代码:

QueryByUserID QueryByUserIDargsargsQueryByUserID
QueryByUserIDUserID为1

总之,非常灵活!

所述最佳实践中不定参数的约定

QueryByUserID 

首先我们先把这里的约定给出来

argsargs[0]map[string]interface{}ID=1ID IN (1,2)argsargs[0]map[string]interface{}argsargs[0]stringargs[1:]args[0]"created_at > ? AND deleted_at > ?"args[1:]

GORM中相关函数源码解读

Where函数

WhereWheremap[string]interface{}queryargs

buildCondition 函数

WhereOrNot

其他问题

通过上面的分析可以知道,在Where中传入的不定参数具有一定的约束,第二 、三…个参数不能随便写。

如果期望传入多个查询条件

string"created_at > ? AND deleted_at > ?"

如果期望传入一个函数回调

在我所遇到的应用场景中,还没有传入回调的场景,就个人经验来看,在没有强规范制约时(当前确实想不到一种合适的规范),传入回调会增加函数复杂度,造成后期代码维护困难。

不定参数用在可有可无的搜索条件

推荐不定参数只用在那些可有可无的搜索条件,如果一个函数定义时已经明确知道函数中需要包含哪些参数,推荐把这些参数显式写在函数定义中,利用Go静态语言的特定,减少编码逻辑上的错误。

小结

本文介绍了使用GORM时加入不定参数后的灵活性,以及这种灵活性背后的约束。通过对GORM中 Where函数和 buildCondition函数 源码的分析,更进一步阐释了这种不定参数的应用规范(及其缘由):

argsargs[0]map[string]interface{}argsargs[0]map[string]interface{}argsargs[0]stringargs[1:]

参考