go_study/bilibili/aceld/struct/reflect/test.go
2024-11-19 12:27:49 +08:00

64 lines
1.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}