Golang反射学习笔记
Golang反射学习笔记
参考连接
package main
import (
"fmt"
"reflect"
)
type common interface {
Love(string) string
}
type people struct {
Name string `json:"name"`
Age int `json:"age"`
}
func (p people) Love(name string) string {
return fmt.Sprintln("junbo")
}
func main() {
p := people{"huxue", 18}
fmt.Println(p)
ptrres := reflect.TypeOf(&p) // 获取反射Type
fmt.Println(ptrres)
fmt.Println(ptrres.Kind()) // 类型 指针 ptr
fmt.Println(ptrres.Elem()) // 指针Type转为非指针Type
fmt.Println(ptrres.Elem().Kind()) // struct
//获取成员变量信息,传值而不是指针
res := reflect.TypeOf(p)
// 通过索引获取
for i := 0; i < res.NumField(); i++ {
field := res.Field(i)
fmt.Printf("%d %s offset %d anonymous %t type %s exported %t json tag %s\n", i,
field.Name, //变量名称
field.Offset, //相对于结构体首地址的内存偏移量,string类型会占据16个字节
field.Anonymous, //是否为匿名成员
field.Type, //数据类型,reflect.Type类型
field.IsExported(), //包外是否可见(即是否以大写字母开头)
field.Tag.Get("json")) //获取成员变量后面``里面定义的tag
}
// 通过字段获取
if field, ok := res.FieldByName("Age"); ok {
fmt.Println(field.Name) //Age
}
if field := res.FieldByIndex([]int{1}); true {
fmt.Println(field) //{Age int json:"age" 16 [1] false}
}
// 获取成员方法信息
for i := 0; i < res.NumMethod(); i++ {
method := res.Method(i)
fmt.Printf("method name:%s ,type:%s, exported:%t\n",
method.Name, // 方法名
method.Type, // 类型
method.IsExported()) // 可导出否
typef := method.Type
fmt.Println(typef.NumIn())
for j := 0; j < typef.NumIn(); j++ {
fmt.Println(j, typef.In(j))
}
for j := 0; j < typef.NumOut(); j++ {
fmt.Println(j, typef.Out(j))
}
}
typepeople := reflect.TypeOf((*people)(nil)).Elem()
fmt.Println(typepeople.Kind() == reflect.Interface)
// 未完待续。。。
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析