injector

Posted by 夏泽民

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>:


Martini

Posted by 夏泽民

先看看injector类型的声明:



hijack

Posted by 夏泽民

https://golang.org/pkg/net/http/



gometalinter

Posted by 夏泽民

SonarQube 是一个开源的代码分析平台, 用来持续分析和评测项目源代码的质量。 通过SonarQube我们可以检测出项目中重复代码, 潜在bug, 代码风格问题,缺乏单元测试等问题, 并通过一个web ui展示出来。 gometalinter 简介 该工具基本上集成了目前市场上所有的检测工具,然后可以并发的帮你静态分析你的代码



HandleFunc

Posted by 夏泽民

golang http的handle模块(一般也称为钩子模块),通过高级语言的匿名函数很容易实现这种内嵌功能的handle



Search

Popular posts

Anything in here will be replaced on browsers that support the canvas element

Recent posts

This blog is maintained by 夏泽民

Get in touch with me at 465474307@qq.com

Subscribe to our mailing list

* indicates required