代码拉取完成,页面将自动刷新
#golang标准库reflect的魔法运用
##本文要解决什么问题?
有时候我们为了简化代码,需要包装使用一些参数数量可变的函数,例如数据库查询用的Query
、Exec
等函数,你的SQL
语句中有多少个“?”,后面就要对应提供多少参数。要包装这样的函数,使用reflect
库是唯一的选择。
##实现方法
废话不多说,下面就说说实质性的内容。
###思路
总体上就是依靠reflect.Value
来实现,一个reflect.Value
赋值为要执行的函数,另外一个数组[]reflect.Value
用来存储参数,最后使用reflect.Value.Call
方法执行函数。
###实例
咱们就拿最简单的fmt.Println
来做例子,给它做一个包装,并且返回它的全部返回值,代码如下:
func WrapPrintln(arg ...interface{}) (int,error) {
var f = reflect.ValueOf( fmt.Println )
var args = make( []reflect.Value, len(arg) )
for i:=0;i<len(arg);i++ {
if arg[i]==nil{
args[i] = reflect.Zero(reflect.TypeOf(errors.New("")))
}else{
args[i] = reflect.ValueOf( arg[i] )
}
}
ret := f.Call( args )
n := ret[0].Interface().(int)
if ret[1].Interface()!=nil{
return n,ret[1].Interface().(error)
} else {
return n,nil
}
}
至于上面的例子为什么要多加一个判断参数是否是nil,是因为reflect.ValueOf(nil)会panic,不得已而为之。
end
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。