因为没有强类型言语的经历,反射这个概念,之前确实没怎么触摸过。在维基百科上搜了一下,详细解说如下:
在计算机学中,反射式编程(英语:refl笔记本电脑怎么连wifiective pro笔记本电脑排名前十gramming)或反射(英语:reflection),是指计算机程序在作业时(runtime)宫颈癌前期症状能够拜访、检测和修改它本身情况或行为的一种才能。用比方来说,反射便是程序在作业的时分能够“调查”并且修改自己的行为。
go 中的反射也是这种效果,能够在程笔记本电脑性价比排行2020序作业期间,获取变量的类型与值的信息,然后进行拜访或或许修改笔记本cpu天梯图。go 言语中,内置了 reflec公积金t
包,用来获取一个变量的类型(type
)与值(value
),对应的办法分别为 reflect.TypeOf()
和 reflect.ValueOf(公积金)
。
反射类型
TypeOf
办法,会回来笔记本该变量的类型政策,类型政策下能够获取到变量的类型与品种。
import (
"fmt"
"reflect"
)
func main() {
// 界说一个int类型的变量
var i int = 1
// 获取变量的类型政策
var typeOfNum = reflect.TypeOf(i)
// 输出类型与品种
typeOfNumName = typeOfNum.Name()
typeOfNumKind = ty笔记本电脑peOfNum.Kind()
fmt.Prin笔记本电脑什么牌子好tf("name: %s, kind: %s", typeOfNumName, typeOfNumKind)
}
能够看到,此时的类型与品种都为 int
。
类型与品种
类型表明界说变量的时分指定的类型,能够反映 type
关键字界说的类型,而品种是变量毕笔记竟归属的类型。说起来或许比较苍白,咱们直接上代码。
type num int
// 界说一个num类型的变量
var i num = 1
v笔记本电脑性价比排行2020ar typeOfNum = reflect.TypeOf(i)
能够看到,此时的类型为 num
,品种为 int
。
关于一些引证类型的变量,比方切片、函数、结构体,kind
都能精确反映其底层的类型。
func printTypeOf(typeOf reflect.Ty宫颈癌前期症状pe) {
fmt.Printf("笔记name: %s, kind: %sn", typeOf.Name(), typeOf.Kind())
}
type Person struct {}
ty笔记本电脑连不上无线网怎么回事pe IntSlice []int
fu笔记本cpu天梯图nc main() {
var a = IntSlice{}
var b = Person{}
printTypeOf(reflect.TypeOf(a))
printTypeO宫颈癌f(reflect.TypeOf(b))
}
而面对匿名结构体或许匿名函数,其类型值会回来为空。
func ma笔记本cpu天梯图in() {
var a = struct {}笔记{}
pr龚俊intTypeOf(reflect.TypeOf(a))
}
反射值
ValueOf
办法,能够获取一个变量的值。
var i =宫颈癌前期症状 3.1415926
var s = "欢迎注重我的群众号:『天然醒的笔记本』"
fmt.Printl笔记本电脑性价比排行2020n(reflect.ValueOf(s))
fmt.Println(reflect.ValueOf(i))
经过反射的值政策,也能取到变量的品种,并且还宫颈癌能根据其品种,调笔记本电脑连不上无线网怎么回事用对应的办法获宫颈癌疫苗取变量的实在值。
var笔记 i = 100
var v = reflect.ValueOf(i)
fmt.Println(v.Int()) // 假如值是 Int 类型,能够经过 Int 办法获取详细笔记本电脑连不上无线网怎么回事值
fmt.Println(v.Kind())
修改值
经过反射得到的值政策,可公积金贷款以对变量本身的值进行修改。首要,在获取反射值时笔记本电脑性价比排行2020,不能直接获取变量的反射值,而是要先取其指针的值政策。
var i = 100
var v = reflect.ValueOf(&i) // 取出变量i的指针的值政策
fmt.Println(v.Kind(), v)
取出指针的值政策之后,不能当即赋值,因为此时拿到的是变量的地址。
要赋值的话,需求先调用 Elem
办法,取出详细元素,然后进行赋值。
var i = 100
var v = reflect.V笔记本电脑什么牌子好alueOf(&i) // 取出变量i的指针的值政策
var e笔记 = v.Elem()
e.SetInt(500) // 修改元素值
fmt.Printl笔记n(e.Kind(), i)
值政策与结构体
前面介绍过,经过笔记本电脑反射能够得到变量的值,关于结构体来说,也是相同。
type Person struct {
name string
age int
gender string
address string
}
var p = Person{"Shenfq", 25, "枸杞男", "湖南长沙"}
var v = reflect.ValueOf(p)
fmt.P笔记本电脑开不了机rintln(v.Kind(), v)
反射值政策还供给了一些办法,专门用来针对结构体成员的信息获取。
NumField()
Num枸杞Field()
能够获取结构体成员的详细数量。
var笔记 p = Person{"Shenfq", 25, "男", "湖南长沙"}笔记本电脑什么牌子好
var v = reflect.ValueOf(p)
fmt.Println("Person 结构体成员数:", v笔记本电脑性价比排行2020.笔记NumField())
Field()
Field()
能够获取结构体指定索引方位的成员的反射值。
var p = Person{"Shenfq", 25, "男", "湖南长沙"Go}
var v = reflect.ValueOf(p)
var num = v.NumField()
for i :宫颈癌疫苗=0; i < num; i++ {
var val = v.Field(i)
fmt.Printf("Person[%d]: %s %vn", i, val.Type(), val)
}
FieldByN笔记本电脑开不了机ame()
FieldByName()
能够获取结构体指定成员称号的成员笔记的反射值。
var p = Person{"Shenfq", 25, "男", "湖南长沙"}笔记本电脑
var v = reflect.ValueOf(p)
var vOfName = v.FieldByName("n宫颈癌ame")
fmt.Printf("Person[name]: %s %vn", vOfName.Type(), v笔记本电脑排名前十OfName)