以铜为镜可以正衣冠,以史为镜可以知兴衰
历史的车轮总是滚滚向前,永不停息。公道自在人心,不管谎言如何美丽,最终都会被戳破,总幻想着颐指气使的居高临下的态度来指教他人,首先必须反思下自身到底有没有资格给别人上课,现在的历史不是一百二十年前的历史,幻想着几尊大炮占领一个国家的时代已然成为历史,总抱着一百多年前的旧思维与我们打交道是行不通的,指三说四也是不行的,惹怒了也是不惹的,最终还是会为自己的愚蠢行为付出相应的代价。
反射
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.order
Kind 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
总结
反射这部分的内容知识点讲解的比较少,算是比较容易掌握的知识点,作为一名优秀的编程从业人员必须拿下这部分的内容,目前的教程中没有添加实际的应用场景,可能随着学习的深入后期会补充一些实际的应用场景案例。