1,反射中调用 函数 既然函数可以像普通的类型变量一样可以的话,那么在反射机制中就和不同的变量是一样的,在反射中 函数 和 方法 的类型(Type)都是 reflect.Func,如果要调用函数的话,可以通过 Value 的 Call() 方法 Value 的 Call() 方法的参数是一个 Value 的 slice,对应的反射函数类型的参数,返回值也是一个 Value 的 slice,同样对应反射函数类型的返回值。通过这个例子,相信你一看就明白了: func prints(i int) string { fmt.Println(“i =”, i) return strconv.Itoa(i) }
func main() { fv := reflect.ValueOf(prints) params := make([]reflect.Value, 1) // 参数 params[0] = reflect.ValueOf(20) // 参数设置为20 rs := fv.Call(params) // rs作为结果接受函数的返回值 fmt.Println(“result:”, rs[0].Interface().(string)) // 当然也可以直接是 rs[0].Interface() 2,反射中调用 方法 函数和方法可以说其实本质上是相同的,只不过方法与一个“对象”进行了“绑定”,方法是“对象”的一种行为,这种行为是对于这个“对象”的一系列操作,例如修改“对象”的某个属性 Method 和 MethodByName 的API, ype MyType struct { i int name string }
func (mt *MyType) SetI(i int) { mt.i = i }
func (mt *MyType) SetName(name string) { mt.name = name }
func (mt *MyType) String() string { return fmt.Sprintf(“%p”, mt) + “–name:” + mt.name + “ i:” + strconv.Itoa(mt.i) } func main() { myType := &MyType{22, “golang”} //fmt.Println(myType) // 就是检查一下myType对象内容 //println(“—————”)
mtV := reflect.ValueOf(&myType).Elem()
// 也可以使用
//mtV := reflect.ValueOf(myType)
fmt.Println("Before:", mtV.MethodByName("String").Call(nil)[0])
params := make([]reflect.Value, 1)
params[0] = reflect.ValueOf(18)
mtV.MethodByName("SetI").Call(params)
params[0] = reflect.ValueOf("reflection test")
mtV.MethodByName("SetName").Call(params)
fmt.Println("After:", mtV.MethodByName("String").Call(nil)[0]) } mtV := reflect.ValueOf(&myType).Elem() fmt.Println("Before:",mtV.Method(2).Call(nil)[0]) params = make([]reflect.Value,1) params[0] = reflect.ValueOf(18) mtV.Method(0).Call(params) params[0] = reflect.ValueOf("reflection test") mtV.Method(1).Call(params) fmt.Println("After:",mtV.Method(2).Call(nil)[0]) <!-- more --> martini的整个框架的后台动力都是来自inject这个包,它其实是独立于框架的一个功能包,里面主要是运用了反射的技术来完成所需要的功能。我自己在学习或者接触一段新代码或者知识点的时候都会先直接找sample运行看跑的结果,所以下面先看一段代码及执行结果<代码1>:
SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中重复代码, 潜在bug, 代码风格问题,缺乏单元测试等问题, 并通过一个web ui展示出来。 gometalinter 简介 该工具基本上集成了目前市场上所有的检测工具,然后可以并发的帮你静态分析你的代码