一. 反射对象的类型 TypeOf
func TypeOf(i interface{}) Type 

type S struct {
a string
}
i := 15
var ss S

fmt.Println(reflect.TypeOf(i)) //输出:int
fmt.Println(reflect.TypeOf(nil)) //输出<nil>
fmt.Println(reflect.TypeOf(ss)) //输出main.S


二. 反射对象的值 ValueOf 获取Value对象,


func (v Value) Type() Type
func (v Value) Kind() Kind

Value.Type()和Value.Kind()这两个方法都可以获取对象或者变量的类型,如果是变量的话,使用这两个方法获取到的类型都是一样,差别是结构体对象:

如果你想拿到结构体里面定义的变量信息的时候,使用Type(f)方法。如果只是相判断是否是结构体时,就使用Kind()

value := reflect.ValueOf(i)

fmt.Println(value.Type()) //输出:int
fmt.Println(value.Kind()) //输出:int

var ss S
value2 := reflect.ValueOf(ss) // 使用ValueOf()获取到结构体的Value对象

fmt.Println(value2.Type()) //输出:S
fmt.Println(value2.Kind()) //输出:struct



三. 反射对象/类的字段数和字段
# Types NumField & Field
func NumField() int
Field(i int) StructField

# Value NumField & Field
func (v Value) NumField() int
func (v Value) Field(i int) Value
通过对象反射类
type  Student struct {
name string "姓名"
age int "年龄"
}
func main() {
var stu = Student{"Tom", 18}
t := reflect.TypeOf(stu)
v := reflect.ValueOf(stu)

fmt.Println("t:", t)
fmt.Println("v:", v)
for i :=0; i < t.NumField(); i++ {
fmt.Printf("Field: %v, Value:%v, Note: %v, Type: %v ", t.Field(i).Name, t.Field(i)., t.Field(i).Tag, t.Field(i).Type)
fmt.Println("aa")
}
}