golang 反射机制

挪威的深林 · · 135 次点击 · · 开始浏览    

go语言也有反射机制,今天自学到go的反射,发现还是很值得记录一些这个知识点的。go语言它是通过 reflect 包的两个接口方法完成的,分别是:

reflect.TypeOf(i interface{}) 和 reflect.ValueOf(i interface{}) ,这时候我们发现 参数是空的接口,也就是说可以接收任何参数,因为所有变量都是默认实现了interface{},这有点类似java所有的类的父类都是Object。在获取当前参数某一类型时候分为type 和 value。type就是在静态声明时候的类型,value就是在代码付的值。go 反射很强大,每个type或者value下面还有个kind,这个kind表示的是运行时当前参数或者对象状态的底层真正的数据类型。举个例子:type X int var count X reflect.TypeOf(count) 得到的就是 main.X 。 reflect.TypeOf(count).kind 得到的就是int。reflect.ValueOf(count) 得到的是 0。 reflect.ValueOf(count).kind 得到的就是 int。 kind函数就是表示type 或者 value 底层运行时具体的数据类型是什么!!!下面是我做练习的例子:

package main

import (

"reflect"

"fmt"

)

type People struct {

name string

age int

height int

}

type Student struct {

people People

}

var people People = People{"Julian", 26, 175}

var mStudent Student = Student{people}

type LoadingView interface {

loadSucceed()

loadFailure()

}

func (people People) loadSucceed() {

}

func (people People) loadFailure() {

}

func testLoad(load LoadingView) {

loadType := reflect.TypeOf(load)

fmt.Print("load的type是:--", loadType)

fmt.Print("\n")

loadTypeKind := loadType.Kind()

fmt.Print("loadType的Kind是:--", loadTypeKind)

fmt.Print("\n")

loadValue := reflect.ValueOf(load)

fmt.Print("load的value是:--", loadValue)

fmt.Print("\n")

loadValueKind := loadValue.Kind()

fmt.Print("load的value的Kind是:--", loadValueKind)

fmt.Print("\n")

switch value := load.(type) {

case People:

fmt.Print(value)

}

}

func main() {

peopleType := reflect.TypeOf(mStudent)

fmt.Print("people的type是:--", peopleType)

fmt.Print("\n")

peopleTypeKind := peopleType.Kind()

fmt.Print("peopleType的Kind是:--", peopleTypeKind)

fmt.Print("\n")

peopleValue := reflect.ValueOf(mStudent)

fmt.Print("people的value是:--", peopleValue)

fmt.Print("\n")

peopleValueKind := peopleValue.Kind()

fmt.Print("people的value的Kind是:--", peopleValueKind)

fmt.Print("\n")

testLoad(people)

}

下面是打印结果:

people的type是:--main.People

peopleType的Kind是:--struct

people的value是:--{Julian 26 175}

people的value的Kind是:--struct

load的type是:--main.People

loadType的Kind是:--struct

load的value是:--{Julian 26 175}

load的value的Kind是:--struct

{Julian 26 175}

本文来自:简书

感谢作者:挪威的深林

查看原文:golang 反射机制

135 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传