github.com/nibnait/go-learn@v0.0.0-20220227013611-dfa47ea6d2da/src/test/chapter/ch6/39_reflect_test.go (about) 1 package unsafe_test 2 3 import ( 4 "fmt" 5 "reflect" 6 "testing" 7 ) 8 9 func TestTypeAndValue(t *testing.T) { 10 var f int64 = 10 11 t.Log(reflect.TypeOf(f), reflect.ValueOf(f)) 12 t.Log(reflect.ValueOf(f).Type()) 13 } 14 15 func CheckType(v interface{}) { 16 t := reflect.TypeOf(v) 17 switch t.Kind() { 18 case reflect.Float32, reflect.Float64: 19 fmt.Println("Float") 20 case reflect.Int, reflect.Int32, reflect.Int64: 21 fmt.Println("Integer") 22 default: 23 fmt.Println("Unknown", t) 24 } 25 } 26 27 func TestBasicType(t *testing.T) { 28 var f float64 = 12 29 CheckType(&f) 30 31 } 32 33 func TestDeepEqual(t *testing.T) { 34 a := map[int]string{1: "one", 2: "two", 3: "three"} 35 b := map[int]string{1: "one", 2: "two", 3: "three"} 36 // t.Log(a == b) 37 t.Log("a==b?", reflect.DeepEqual(a, b)) 38 39 s1 := []int{1, 2, 3} 40 s2 := []int{1, 2, 3} 41 s3 := []int{2, 3, 1} 42 43 t.Log("s1 == s2?", reflect.DeepEqual(s1, s2)) 44 t.Log("s1 == s3?", reflect.DeepEqual(s1, s3)) 45 46 c1 := Customer2{"1", "Mike", 40} 47 c2 := Customer2{"1", "Mike", 40} 48 fmt.Println(c1 == c2) 49 fmt.Println(reflect.DeepEqual(c1, c2)) 50 } 51 52 type Employee struct { 53 EmployeeID string 54 Name string `format:"normal"` 55 Age int 56 } 57 58 func (e *Employee) UpdateAge(newVal int) { 59 e.Age = newVal 60 } 61 62 type Customer2 struct { 63 CookieID string 64 Name string 65 Age int 66 } 67 68 func TestInvokeByName(t *testing.T) { 69 e := &Employee{"1", "Mike", 30} 70 //按名字获取成员 71 t.Logf("Name: value(%[1]v), Type(%[1]T) ", reflect.ValueOf(*e).FieldByName("Name")) 72 if nameField, ok := reflect.TypeOf(*e).FieldByName("Name"); !ok { 73 t.Error("Failed to get 'Name' field.") 74 } else { 75 t.Log("Tag:format", nameField.Tag.Get("format")) 76 } 77 reflect.ValueOf(e).MethodByName("UpdateAge"). 78 Call([]reflect.Value{reflect.ValueOf(1)}) 79 t.Log("Updated Age:", e) 80 }