GOGOUP-12. 反射

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

一、反射的前提

  1. golang的反射是建立在类型的基础之上,回顾下类型示意图
    GOGOUP-12. 反射
  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. 反射

GOGOUP-12. 反射

上一篇:GWT常用小组件(2)


下一篇:js中数组操作