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)
	// 未完待续。。。
}


posted @   Notomato  阅读(26)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示