历史的车轮总是滚滚向前,永不停息。公道自在人心,不管谎言如何美丽,最终都会被戳破,总幻想着颐指气使的居高临下的态度来指教他人,首先必须反思下自身到底有没有资格给别人上课,现在的历史不是一百二十年前的历史,幻想着几尊大炮占领一个国家的时代已然成为历史,总抱着一百多年前的旧思维与我们打交道是行不通的,指三说四也是不行的,惹怒了也是不惹的,最终还是会为自己的愚蠢行为付出相应的代价。
反射
1、什么是发射?
反射说的简单点就是程序在运行的过程中,通过某种方式能够获取变量的类型和值,这种方式就称之为反射。而go语言中的反射主要是通过reflect包实现的,其中reflect.TypeOf()和reflect.ValueOf分别返回reflect.Type和reflect.Value。
type order struct { ordID int customerID int}func createquery(q interface{}) { t := reflect.TypeOf(q) v := reflect.ValueOf(q) fmt.Println("Type ", t) fmt.Println("Value ", v)}func main() { o := order{ ordID: 456, customerID: 56, } createquery(o)}
2、reflect.Type和reflect.Kind的区别
reflect.Type和reflect.Kind的区别是前者表示实际类型,而后者表示该类型的特定的类别
//举个栗子type order struct { ordID int customerID int}func createquery(q interface{}) { t := reflect.TypeOf(q) k := t.Kind() fmt.Println("Type ", t) fmt.Println("Kind ", k)}func main() { o := order{ ordID: 456, customerID: 56, } createquery(o)}//输出的结果为Type main.orderKind struct
3、NumFIEld()和FIEld()方法
NumFIEld方法返回结构体中字段的数量,而FIEld(i int)方法返回i的reflect.Value。
//举个栗子type order struct { ordID int customerID int}func createquery(q interface{}) { if reflect.ValueOf(q).Kind() == reflect.Struct { v := reflect.ValueOf(q) fmt.Println("Number of fIElds", v.NumFIEld()) for i := 0; i < v.NumFIEld(); i++ { fmt.Printf("FIEld:%d type:%T value:%v\n", i, v.FIEld(i), v.FIEld(i)) } }}func main() { o := order{ ordID: 456, customerID: 56, } createquery(o)}
输出:
Number of fIElds 2
FIEld:0 type:reflect.Value value:456
FIEld:1 type:reflect.Value value:56
4、Int和String方法
Int和String可以帮助我们分别提取reflect.Value作为int64和string.
//举个栗子func main() { a := 56 x := reflect.ValueOf(a).Int() fmt.Printf("type:%T value:%v\n", x, x) b := "Naveen" y := reflect.ValueOf(b).String() fmt.Printf("type:%T value:%v\n", y, y)}
输出:
type:int64 value:56
type:string value:Naveen
总结
反射这部分的内容知识点讲解的比较少,算是比较容易掌握的知识点,作为一名优秀的编程从业人员必须拿下这部分的内容,目前的教程中没有添加实际的应用场景,可能随着学习的深入后期会补充一些实际的应用场景案例。
总结以上是内存溢出为你收集整理的go语言的魔幻旅程14-反射全部内容,希望文章能够帮你解决go语言的魔幻旅程14-反射所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)