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 }