Go:reflect 反射

By kcersing , 2 四月, 2020

import (
    "fmt"
    "reflect"
    "testing"
)
//reflect.TypeOf 返回类型(reflect.Type)
//reflect.ValueOf 返回值(reflect.Value)
//可以从reflect.Value 获得类型
//通过Kind来判断类型
func TestTypeAndValue(t *testing.T) {
    var f int64 = 10
    t.Log(reflect.TypeOf(f), reflect.ValueOf(f))
    t.Log(reflect.ValueOf(f).Type())
}
func CheckType(v interface{}) {
    t := reflect.TypeOf(v)
    switch t.Kind() {
    case reflect.Float32, reflect.Float64:
        fmt.Println("Float")
    case reflect.Int, reflect.Int32, reflect.Int64:
        fmt.Println("Integer")
    default:
        fmt.Println("Unknown", t)
    }
}
func TestBasicType(t *testing.T) {
    var f float64 = 12
    CheckType(f)
}
//按名字访问结构成员
//reflect.ValueOf(*e).FieldByName("Name")
//按名字发访问结构方法
//reflect.ValueOf(e).MethodByName("UpdateAge").Call([]reflect.Value{reflect.ValueOf(1)})
type Employee struct {
    EmployeeId string
    Name       string `format:"normal"`//标记
    Age        int
}
func (e *Employee) UpdateAge(newVal int) {
    e.Age = newVal
}
type Customer struct {
    CookieId string
    Name     string
    Age      string
}
func TestInvokeByName(t *testing.T) {
    e := &Employee{"1", "Mike", 30}
    //按名字获取成员
    t.Logf("Name:value(%[1]v),Type(%[1]T)", reflect.ValueOf(*e).FieldByName("Name"))
    if nameField, ok := reflect.TypeOf(*e).FieldByName("Name"); !ok {
        t.Error("Failed to get 'Name' field.")
    } else {
        t.Log("Tag:format", nameField.Tag.Get("format"))
    }
    reflect.ValueOf(e).MethodByName("UpdateAge").Call([]reflect.Value{reflect.ValueOf(1)})
    t.Log("Updated Age:", e)
}


标签