反射
- 反射:可以在运行时动态获取变量的相关信息
- Import (“reflect”)
- reflect.TypeOf(),获取变量的类型,返回reflect.Type类型
- reflect.ValueOf(),获取变量的值,返回reflect.Value类型
- reflect.Value.Kind(),获取变量的类别,返回一个常量
- reflect.Value.Interface(),转换成interface{}类型
- Import (“reflect”)
例子
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253package mainimport ("fmt""reflect")type Student struct {Name stringAge intScore float32}func test(b interface{}) {t := reflect.TypeOf(b)fmt.Println(t)v := reflect.ValueOf(b)k := v.Kind()fmt.Println(k)iv := v.Interface()stu, ok := iv.(Student)if ok {fmt.Printf("%v %T\n", stu, stu)}}func testInt(b interface{}) {val := reflect.ValueOf(b)val.Elem().SetInt(100)c := val.Elem().Int()fmt.Printf("get value interface{} %d\n", c)fmt.Printf("string val:%d\n", val.Elem().Int())}func main() {var a Student = Student{Name: "stu01",Age: 18,Score: 92,}test(a)var b int = 1b = 200testInt(&b)fmt.Println(b)}12345678910111213141516171819202122package mainimport ("fmt""reflect")func main() {var x float64 = 3.4fmt.Println("type:", reflect.TypeOf(x))v := reflect.ValueOf(x)fmt.Println("value:", v)fmt.Println("type:", v.Type())fmt.Println("kind:", v.Kind())fmt.Println("value:", v.Float())fmt.Println(v.Interface())fmt.Printf("value is %5.2e\n", v.Interface())y := v.Interface().(float64)fmt.Println(y)}获取变量的值
- reflect.ValueOf(x).Float()
- reflect.ValueOf(x).Int()
- reflect.ValueOf(x).String()
- reflect.ValueOf(x).Bool()
通过反射的来改变变量的值
reflect.Value.SetXX相关方法,比如:
- reflect.Value.SetFloat(),设置浮点数
- reflect.Value.SetInt(),设置整数
- reflect.Value.SetString(),设置字符串
- 123456789101112131415package mainimport ("fmt""reflect")func main() {var a float64fv := reflect.ValueOf(a)fv.SetFloat(3.3)fmt.Printf("%v\n", a)}//会panic
实际应该是指针才能修改a值类型
- ValueOf(a) 传进去的是一个a的拷贝,所以改变不了值
- 应该使用Elem()
- 相当于获取指针来指向变量
123456789101112131415package mainimport ("fmt""reflect")func main() {var a float64fv := reflect.ValueOf(&a)fv.Elem().SetFloat(3.3)fmt.Printf("%v\n", a)}//OK