/ 2019-04-10
反射操作应用
一、通过反射操作基本类型,来改变基本类型的值。
package main
import (
"fmt"
"reflect"
)
func main() {
var a int = 1
a = 100
val := reflect.ValueOf(&a)
val.Elem().SetInt(200)
b := val.Elem().Int()
fmt.Printf("a => %d , b => %d\n", a, b)
}
运行结果:
a => 200 , b => 200
二、反射操作结构体及调用结构体方法。
package main
import (
"fmt"
"reflect"
)
type School struct {
Name string
Course string
}
func (s School) Echo() {
fmt.Printf("name : %s , Course : %s \n", s.Name, s.Course)
}
func main() {
o := School{
Name: "oldboy",
Course: "Linux",
}
val := reflect.ValueOf(&o)
kd := val.Kind()
if kd != reflect.Ptr && val.Elem().Kind() == reflect.Struct {
fmt.Println("expect struct")
return
}
//获取字段数量
fields := val.Elem().NumField()
fmt.Printf("struct has %d field\n", fields)
//获取字段的类型
for i := 0; i < fields; i++ {
fmt.Printf("%d %v\n", i, val.Elem().Field(i).Kind())
}
// 操作结构体
val.Elem().Field(1).SetString("Golang")
//获取方法数量
methods := val.NumMethod()
fmt.Printf("struct has %d methods\n", methods)
//反射调用的Echo方法
var params []reflect.Value
val.Elem().Method(0).Call(params)
}
运行结果:
struct has 2 field
0 string
1 string
struct has 1 methods
name : oldboy , Course : Golang
反射综合应用
1、定义一个结构体
2、给结构体赋值
3、用反射获取结构体的下标、结构体名称、类型、值
4、改变结构体的值
package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string
Age int
}
func main() {
u := Student{"oldboy", 18}
v := reflect.ValueOf(&u).Elem()
t := v.Type()
for i := 0; i < v.NumField(); i++ {
f := v.Field(i)
fmt.Printf("构体的下标: %d: 名称: %s 类型: %s 值: %v\n", i,
t.Field(i).Name, f.Type(), f.Interface())
}
v.Field(0).SetString("老男孩")
v.Field(1).SetInt(100)
fmt.Println("u is now", u)
}
更多内容请关注公众号:Go程序员开发
(2)