github.com/searKing/golang/go@v1.2.74/util/object/dump.go (about)

     1  // Copyright 2020 The searKing Author. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package object
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"reflect"
    11  	"strconv"
    12  )
    13  
    14  // 获取一个对象的字段和方法
    15  func DumpMethodInfo(i interface{}) []byte {
    16  	var b bytes.Buffer
    17  
    18  	// 获取 i 的类型信息
    19  	t := reflect.TypeOf(i)
    20  
    21  	for {
    22  		// 进一步获取 i 的类别信息
    23  		if t.Kind() == reflect.Struct {
    24  			// 只有结构体可以获取其字段信息
    25  			_, _ = fmt.Fprintf(&b, "\n%-8v %v 个字段:\n", t, t.NumField())
    26  			// 进一步获取 i 的字段信息
    27  			for i := 0; i < t.NumField(); i++ {
    28  				fmt.Println(t.Field(i).Name)
    29  			}
    30  		}
    31  		// 任何类型都可以获取其方法信息
    32  		_, _ = fmt.Fprintf(&b, "\n%-8v %v 个方法:\n", t, t.NumMethod())
    33  		// 进一步获取 i 的方法信息
    34  		for i := 0; i < t.NumMethod(); i++ {
    35  			_, _ = fmt.Fprintln(&b, t.Method(i).Name)
    36  		}
    37  		if t.Kind() == reflect.Ptr {
    38  			// 如果是指针,则获取其所指向的元素
    39  			t = t.Elem()
    40  		} else {
    41  			// 否则上面已经处理过了,直接退出循环
    42  			break
    43  		}
    44  	}
    45  	return b.Bytes()
    46  }
    47  
    48  // DumpFuncInfo returns m's function info
    49  func DumpFuncInfo(m interface{}) []byte {
    50  	//Reflection type of the underlying data of the interface
    51  	x := reflect.TypeOf(m)
    52  
    53  	numIn := x.NumIn()   //Count inbound parameters
    54  	numOut := x.NumOut() //Count outbounding parameters
    55  	var b bytes.Buffer
    56  
    57  	_, _ = fmt.Fprintln(&b, "Method:", x.String())
    58  	_, _ = fmt.Fprintln(&b, "Variadic:", x.IsVariadic()) // Used (<type> ...) ?
    59  	_, _ = fmt.Fprintln(&b, "Package:", x.PkgPath())
    60  
    61  	for i := 0; i < numIn; i++ {
    62  
    63  		inV := x.In(i)
    64  		inKind := inV.Kind() //func
    65  		_, _ = fmt.Fprintf(&b, "\nParameter IN: "+strconv.Itoa(i)+"\nKind: %v\nName: %v\n-----------", inKind, inV.Name())
    66  	}
    67  	for o := 0; o < numOut; o++ {
    68  
    69  		returnV := x.Out(0)
    70  		returnKind := returnV.Kind()
    71  		_, _ = fmt.Fprintf(&b, "\nParameter OUT: "+strconv.Itoa(o)+"\nKind: %v\nName: %v\n", returnKind, returnV.Name())
    72  	}
    73  	return b.Bytes()
    74  }