首页 > 其他 > 详细

GOGOUP-12. 反射

时间:2021-07-10 16:10:53      阅读:21      评论:0      收藏:0      [点我收藏+]

万丈高楼平地起-接口和多态

一、反射的前提

  1. golang的反射是建立在类型的基础之上,回顾下类型示意图
    技术分享图片
  2. static type是编码看得见的类型(int,string,float64...),concrete type 是runtime系统看见的类型
  3. 反射主要与golang的interface类型相关,即只和concrete type 有关。每个人interface变量都有个对应的pair,pair中记录实际变量的值和类型

二、reflect

  1. 反射的基本使用
    package main
    
    import (
    	"fmt"
    	"reflect"
    )
    
    //定义个结构体类型
    type Stu struct {
    	Age  int
    	Name string
    }
    
    //給结构添加一个方法 注意添加方法不是指针
    func (stu Stu) Study() {
    	fmt.Printf("stu is study %v\n", stu)
    }
    
    func reflectObj(arg interface{}) {
    
    	//获取变量的类型、这里的type是指变量所属类型,包括原生类型
    	inputType := reflect.TypeOf(arg)
    	fmt.Println("type: ", inputType)
    	//kind 指变量类型所属 大类
    	fmt.Println("kind: ", inputType.Kind())
    	//获取变量值
    	inputValue := reflect.ValueOf(arg)
    	fmt.Println("value: ", inputValue)
    	//获取变量的字段
    	for i := 0; i < inputType.NumField(); i++ {
    		//获取字段
    		field := inputType.Field(i)
    		//获取字段值
    		value := inputValue.Field(i).Interface()
    		fmt.Println("field: ", field.Name, "value: ", value)
    	}
    	//获取方法
    	for i := 0; i < inputType.NumMethod(); i++ {
    		m := inputType.Method(i)
    		fmt.Println("method name: ", m.Name, "method type: ", m.Type)
    	}
    
    }
    func main() {
    	//声明一个变量
    	stu := Stu{12, "xiaogang"}
    	reflectObj(stu)
    }
    
    
  2. 执行结果
    技术分享图片

GOGOUP-12. 反射

原文:https://www.cnblogs.com/nextworld/p/14993637.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!