反射:可以在运行时动态获取变量的相关信息

reflect.TypeOf,获取变量的类型,返回reflect.Type类型
reflect.ValueOf,获取变量的值,返回reflect.Value类型
reflect.Value.Kind,获取变量的类别,返回一个常量
reflect.Value.Interface(),转换成interface{}类型
修改变量的值
类型检查代码
func getTypeInfo(a interface{}) {
typeInfo := reflect.TypeOf(a)
kind := typeInfo.Kind()
fmt.Println("kind of a:", kind)
//NumMethod :获取当前变量a 有多少个方法
num := typeInfo.NumMethod()
fmt.Println("method num:", num)
//MethodByName:通过名字获取方法的定义
method, ok := typeInfo.MethodByName("SetName")
if !ok {
fmt.Println("not have method SetName")
} else {
fmt.Println(method)
}
fmt.Println()
fmt.Println()
}
func getAllMethod(a interface{}) {
typeInfo := reflect.TypeOf(a)
//NumMethod:获取变量实现方法的个数
num := typeInfo.NumMethod()
for i := 0;i func testGetValuInfo() {
var i int = 100
//获取值相关信息,返回一个结构体
valueInfo := reflect.ValueOf(&i)
//因为修改值,需要传递指针,所以呢,使用反射中的 Elem 方法,就是用来修改传递指针
valueInfo.Elem().SetInt(200)
tmp := valueInfo.Interface()
val := tmp.(*int)
fmt.Println("val:", val)
fmt.Println("val of valueInfo:", valueInfo.Elem().Int())
fmt.Println("type:", valueInfo.Type())
fmt.Println("kind:", valueInfo.Kind())
fmt.Println("i=", i)
var stu Student
valueInfo = reflect.ValueOf(stu)
fmt.Println("type:", valueInfo.Type())
fmt.Println("kind:", valueInfo.Kind())
}操作结构体
reflect.Value.NumField()获取结构体中字段的个数
reflect.Value.Method(n).Call来调⽤结构体中的⽅法
package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string
Age int
Sex int
}
func (s *Student) Set(name string , Age int, Sex int) {
s.Name = name
s.Age = Age
s.Sex = Sex
}
func (s *Student) GetName(name string) {
s.Name = name
}
func testStruct () {
var stu *Student = &Student{}
stu.Set("jim", 18, 1)
valueInfo := reflect.ValueOf(stu)
fieldNum := valueInfo.Elem().NumField()
fmt.Println("field name:", fieldNum)
sexValueInfo := valueInfo.Elem().FieldByName("Sex")
fmt.Println("sex=", sexValueInfo.Int())
sexValueInfo.SetInt(100)
fmt.Println(stu)
setMethod := valueInfo.MethodByName("Set")
fmt.Println(setMethod)
var params []reflect.Value
name := "Tom"
age := 1000
sex := 3883
params = append(params, reflect.ValueOf(name))
params = append(params, reflect.ValueOf(age))
params = append(params, reflect.ValueOf(sex))
setMethod.Call(params)
fmt.Println(stu)
}
func main() {
testStruct()
}创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
网页名称:Go(6[反射])-创新互联
链接地址:http://cdxtjz.cn/article/dcdjge.html