64 lines
1.4 KiB
Go
64 lines
1.4 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"reflect"
|
||
)
|
||
|
||
type User struct {
|
||
Id int
|
||
Name string
|
||
Age int
|
||
}
|
||
|
||
func (this *User) Call() {
|
||
fmt.Println("user is called...")
|
||
fmt.Printf("%v\n", this)
|
||
}
|
||
|
||
func (this User) ThisCall() {
|
||
fmt.Println("user is called...")
|
||
fmt.Printf("%v\n", this)
|
||
}
|
||
|
||
func reflectNum(arg interface{}) {
|
||
fmt.Println("type: ", reflect.TypeOf(arg))
|
||
fmt.Println("value: ", reflect.ValueOf(arg))
|
||
}
|
||
|
||
func main() {
|
||
var num float64 = 1.2345
|
||
reflectNum(num)
|
||
|
||
user := User{1, "Aceld", 18}
|
||
|
||
DoFieldAndMethod(user)
|
||
}
|
||
|
||
func DoFieldAndMethod(input interface{}) {
|
||
// 获取input的type
|
||
inputType := reflect.TypeOf(input)
|
||
fmt.Println("inputType is: ", inputType.Name())
|
||
|
||
// 获取input的value
|
||
inputValue := reflect.ValueOf(input)
|
||
fmt.Println("inputValue is: ", inputValue)
|
||
fmt.Println(inputType.NumMethod())
|
||
|
||
// 通过type获取里面的字段
|
||
// 1. 获取interface的reflect.Type,通过Type得到NumField,进行遍历
|
||
// 2. 得到每个field,数据类型
|
||
// 3. 通过field有一个Interface()方法得到对应的value
|
||
// for i := 0; i < inputType.NumField(); i++ {
|
||
// field := inputType.Field(i)
|
||
// value := inputValue.Field(i).Interface()
|
||
// fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)
|
||
// }
|
||
|
||
// 通过type获取里面的方法,调用
|
||
for i := 0; i < inputType.NumMethod(); i++ {
|
||
m := inputType.Method(i)
|
||
fmt.Printf("%s: %v\n", m.Name, m.Type)
|
||
}
|
||
}
|