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  }