go 反射练习

代码:

package main

import (
	"fmt"
	"reflect"
)

type User struct {
	Id   int
	Name string
	Age  int
}

func (u User) Hello() {
	fmt.Println("Hello World")
}

func main() {

	/*
		基本类型
	*/
	var x float64 = 1.1

	//TypeOf
	fmt.Println("-----------------TypeOf------------------")
	fmt.Println("reflect.TypeOf(x):", reflect.TypeOf(x))
	fmt.Println("reflect.TypeOf(x).Kind():", reflect.TypeOf(x).Kind())

	//ValueOf
	fmt.Println("-----------------ValueOf-----------------")
	fmt.Println("reflect.ValueOf(x):", reflect.ValueOf(x))

	fmt.Println("reflect.ValueOf(x).Type():", reflect.ValueOf(x).Type())
	fmt.Println("reflect.ValueOf(x).Canset():", reflect.ValueOf(x).CanSet())

	fmt.Println("reflect.ValueOf(&x).Elem():", reflect.ValueOf(&x).Elem())
	fmt.Println("reflect.ValueOf(&x).Elem().CanSet():", reflect.ValueOf(&x).Elem().CanSet())

	reflect.ValueOf(&x).Elem().SetFloat(1.21)
	fmt.Println("reflect.ValueOf(&x).Elem().Interface():", reflect.ValueOf(&x).Elem().Interface())

	/*
		struct
	*/
	fmt.Println("-----------------struct-----------------")
	u := User{1, "ok", 12}

	fmt.Println(reflect.TypeOf(u).Kind() == reflect.Struct)
	for i := 0; i < reflect.TypeOf(u).NumField(); i++ {
		fmt.Printf("字段: %6s\n", reflect.TypeOf(u).Field(i))
		fmt.Printf("字段名: %6s | 字段类型: %v | 字段值: %v\n", reflect.TypeOf(u).Field(i).Name, reflect.TypeOf(u).Field(i).Type, reflect.ValueOf(u).Field(i).Interface())
	}

	for i := 0; i < reflect.TypeOf(u).NumMethod(); i++ {
		fmt.Printf("reflect.TypeOf(u).Method(i).Name: %6s\n reflect.TypeOf(u).Method(i).Type: %v\n", reflect.TypeOf(u).Method(i).Name, reflect.TypeOf(u).Method(i).Type)
	}

}