为了根据用户ID(UserID)获取到相应的话题(Topic),我们定义了一个QueryByUserID
的方法,为了表意刻意传入了一个参数,同时在QueryByUserID
的最后强行添加了一个args
不定参数,从而接受调用时传入的附加的参数,在函数体内根据args
的长度对它进行不同方式的应用,达到了优雅扩展QueryByUserID
的功能。
看下面的代码:
1 | // Topic 话题 |
在添加了不定参数的情况下,调用QueryByUserID
时如果想要进一步精细地搜索话题,比如想要获取UserID为1
且最近一周发布的话题,可以这么写了:
1 | topics, err := (&Topic{}).QueryByUserID(1, "created_at > ?", time.Now().Add(-7*24*time.Hour) |
总之,非常灵活!
所述最佳实践中不定参数的约定
在QueryByUserID
中根据传入的不定参数的数量,采用不同的传入方式,其实这里遵循了GORM中Where条件语句的作用方式。
1 | // ... |
首先我们先把这里的约定给出来:
- 当传入的
args
长度为1时,如果args[0]
不是一个map[string]interface{}
的值,这个值必须能够作用到主键上面。比如1
,表示主键ID为1(ID=1
)的记录;比如[]int{1,2}
,表示主键ID为1和2(ID IN (1,2)
)的记录; - 否则,当传入的
args
长度为1时,args[0]
必须是一个map[string]interface{}
的值; - 当传入的
args
长度大于等于2时,args[0]
必须是一个string
类型的值,且包含了args[1:]
中同等个数的占位符。打个比方,如果args[0]
真实值为"created_at > ? AND deleted_at > ?"
,那么args[1:]
则应该包含两个值,一个对应第一个问号(即创建时间),一个对应第二个问号(即删除时间)。