当遇到不限参数个数和类型的函数时,比如redis的Do方法,为了方便调用我们一般会封装一个同一的入口,参数均为命令串,然后再将命令串参数解析成Do函数的参数类型进行调用,这里简单记录一下这类参数的处理过程
调用的函数定义如下,从第二个参数起可以传任意多个不限类型的参数,params类型为[]interface{}
Do(commandName string, params ...interface{}) (reply interface{}, err error)
封装成统一的命令执行入口,这里有关参数转换的主要逻辑是
- 从命令串中获取参数部分cmdArgs,类型为[]string
- 将cmdArgs转换为args,注意[]string不能实现[]interface{},但是任意类型都可以实现{}interface,所以需要遍历cmdArgs将其元素均以interface{}表示来完成转换
- args… 相当于将列表中的元素读取出来作为单独的参数传进去
func RedisCmdExec(serverType string, port int32, cmd string) (reply []byte, err error) {
...
// 解析命令,将命令转换为cmd和参数两部分
cmdConv := strings.Fields(cmd)
// cmdArgs := strings.Join(cmdConv[1:], " ")
cmdArgs := cmdConv[1:]
cmdHead := cmdConv[0]
// 将[]string转换为[]interface{}
args := make([]interface{}, 0)
if len(cmdArgs) > 0 {
for _, arg := range cmdArgs {
args = append(args, arg)
}
}
reply, err = con.Do(cmd, args...)
return reply, err
}