1.Go语言的反射机制

再说明Go语言的反射机制之前,我们需要先了解Go语言的变量组成,Go语言的变量由两部分组成:

(1)数据类型(type)

Go语言中,数据类型又分为两种

  • static type (int, strinng等基本类型)
  • concrete type (由struct定义的类型,interface{}所指向的具体数据类型)

(2)数据的值(value)

1.1 pair

在GO语言中(数据类型+数据的值 = pair),这在在创建之后一直不变的。我们可以看个例子:

package mainimport "fmt"func main()  {// a的pair(type=string, value='hello')var a string= "hello"// b的pari(type=, value=)var b interface{}// b的pari(type=string, value='hello')b = a// b为什么可以断言成功?因此b的type是stringvalue, ok := b.(string)fmt.Println(ok)fmt.Println(value)}

运行结果:

true
hello

可以看到,我们先声明了一个字符串变量a并赋值"hello",这时,a的pair就是(type=string, value='hello'),接着定义一个万能类型b,此时他的type和value均为0,我们让b=a,则b的pair(type=string, value='hello'),后面我们对string进行了一次类型转换(也可以理解类型断言),返回的是转换的结果ok,和转换后的类型value(string),这里需要注意的是,如果转换失败,返回的是该类型的零值。在这里,为什么类型转换能够成功呢,这就是pair在起作用,可以看到,interface{}变量b的pair的type为string,所以在对b做类型转换,转换成string时能够成功。

我们可以再举一个多态的例子:

package mainimport "fmt"type inter1 interface{Walk()
}type inter2 interface {Run()
}type interImpl struct {}func (this *interImpl) Walk(){fmt.Println("Walk")
}func (this *interImpl) Run(){fmt.Println("Run")
}func main() {//a: pair(type=interImpl, value = interImpl{}的地址)a := &interImpl{}//b: pair(type=, value=)var b inter1//b: pair(type=interImpl, value = interImpl{}的地址)b = ab.Walk()fmt.Println("..............................")//c: pair(type=, value=)var c inter2//b: pair(type=interImpl, value = interImpl{}的地址)c = b.(inter2)c.Run()
}

运行结果:

Walk
..............................
Run

可以看到,我们定义两个接口inter1和inter2,interImpl是这个接口的实现类,我们再main方法中先声明interImpl类型的指针a并赋值,其pair(type=interImpl, value = interImpl{}的地址),接着,将其赋值给b,则b的pair就是(type=interImpl, value = interImpl{}的地址),紧接着,我们将b转换成inter2类型,可以看到是成功了的,为什么b可以转换成inter2类型呢,这就是pair不变性,即b本质上是interImpl类型(根据b 的pair的type),他一样实现了inter2接口,所以可以转换。

2.reflect包的简单用法

package mainimport ("fmt""reflect"
)type Person struct {Name stringGender stringAge int
}func (this *Person) Walk(){fmt.Println("Walk")
}func (this *Person) Run(){fmt.Println("Run")
}func main() {// 声明一个Person类型并赋值a := Person{"tom","female",15}// 通过反射获取a变量的类型和值aType := reflect.TypeOf(a)aValue := reflect.ValueOf(a)fmt.Println("a type is ", aType)fmt.Println("a value is ", aValue)
}

运行结果:

a type is  main.Person
a value is  {tom female 15}

可以看到,通过reflect包的TypeOf方法和ValueOf方法可以很容易获取一个变量的类型和值,在这里a的数据类型为Person类型,其值为对象Person{"tom","female",15}。我们也可以通过reflect获取Person的属性值和方法:

package mainimport ("fmt""reflect"
)type Person struct {Name stringGender stringAge int
}func (this Person) Walk(){fmt.Println("Walk")
}func (this Person) Run(){fmt.Println("Run")
}func main() {// 声明一个Person类型并赋值a := Person{"tom","female",15}// 通过反射获取a变量的类型和值aType := reflect.TypeOf(a)aValue := reflect.ValueOf(a)for i := 0; i < aType.NumField(); i++ {field := aType.Field(i)value := aValue.Field(i).Interface()fmt.Println(field.Name ," type is ", field.Type)fmt.Println("value=", value)}for i := 0; i < aType.NumMethod(); i++ {method := aType.Method(i)methodValue := aValue.Method(i)fmt.Println(method.Name, "type is", method.Type)fmt.Println("value=", methodValue)}
}

运行结果:

Name  type is  string
value= tom
Gender  type is  string
value= female
Age  type is  int
value= 15
Run type is func(main.Person)
value= 0x869040
Walk type is func(main.Person)
value= 0x869040

以上为reflect的简单应用,可以用TypeOf的返回值进一步获取属性和方法的类型

同理,可以用ValueOf的返回值进一步获取属性值和方法值。

Go语言学习之入门篇(十三)相关推荐

  1. R语言学习笔记——入门篇:第一章-R语言介绍

    R语言 R语言学习笔记--入门篇:第一章-R语言介绍 文章目录 R语言 一.R语言简介 1.1.R语言的应用方向 1.2.R语言的特点 二.R软件的安装 2.1.Windows/Mac 2.2.Lin ...

  2. R语言学习笔记——入门篇:第三章-图形初阶

    R语言 R语言学习笔记--入门篇:第三章-图形初阶 文章目录 R语言 一.使用图形 1.1.基础绘图函数:plot( ) 1.2.图形控制函数:dev( ) 补充--直方图函数:hist( ) 补充- ...

  3. 易语言学习笔记——入门篇

    易语言学习笔记20180709 最早接触易语言是三年前的事情了,那时候是因为DNF这个游戏我才知道了易语言这个编程语言,当时对他就非常的憧憬.只不过那时候易语言的学习资源比较少,而且自身的学业比较重就 ...

  4. 程序猿编程课堂 Python学习之入门篇1:环境搭建与第一个程序

    前言: Python作为目前比较热门的编程语言,其简单和简洁的语法使它成为一种非常好的通用编程语言,它是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),并且随着版本的不断更新和 ...

  5. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  6. C# 学习笔记入门篇(上)

    文章目录 C# 学习笔记入门篇 〇.写在前面 Hello World! 这篇学习笔记适合什么人 这篇学习笔记到底想记什么 附加说明 一.命名空间 "进入"命名空间 嵌套的命名空间. ...

  7. Vue学习笔记入门篇——数据及DOM

    本文为转载,原文:Vue学习笔记入门篇--数据及DOM 数据 data 类型 Object | Function 详细 Vue 实例的数据对象.Vue 将会递归将 data 的属性转换为 getter ...

  8. 猿编程python代码_程序猿编程课堂 Python学习之入门篇3:简单的数据类型

    1. 什么是数据类型? 我们知道编程就是编写程序解决某个问题,而任何能使用编程来解决的问题都是能够提取或者转换出相应的数据,只是数据的表达形式是不一样的,而这表达形式就是数据类型. 比如,数学中的数字 ...

  9. R语言学习笔记——高级篇:第十四章-主成分分析和因子分析

    R语言 R语言学习笔记--高级篇:第十四章-主成分分析和因子分析 文章目录 R语言 前言 一.R中的主成分和因子分析 二.主成分分析 2.1.判断主成分的个数 2.2.提取主成分 2.3.主成分旋转 ...

最新文章

  1. 通过读源码win10驱动下实现3环的GetEnvironmentVariable
  2. springboot actuator_Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控...
  3. uniapp可以封装组件嘛_uniapp聊天App实例|vue+uniapp仿微信界面|红包|朋友圈
  4. C# / VB.NET合并PDF指定页
  5. html 形状div,div+css实现各种形状(精心整理)
  6. Java构造字符串算法题_LeetCode算法题-Repeated Substring Pattern(Java实现)
  7. Firemonkey的旁门左道[六]
  8. pythondjango是干什么的_python django框架是什么?怎么使用?
  9. python打开chrome浏览器登录用户名密码_[工具]Python获取Chrome浏览器已保存的所有账号密码...
  10. 移动web点5像素的秘密(转)
  11. 整合SSH框架实现简单登录
  12. MyBatis中Mapper接口是怎么和XML文件关联起来的
  13. 计算机考研数据结构教材,2016计算机考研:数据结构参考书及复习重点
  14. aspen怎么做灵敏度分析_灵敏度分析_aspen
  15. 表情识别论文《OAENet Oriented Attention Ensemble for Accurate FacialExpression Recognition》中文翻译
  16. 单波段彩色变换(伪彩色密度分割)
  17. Verilog学习笔记HDLBits——Finite State Machines(1)
  18. unity手机端指南针安卓测试有效
  19. 【海南赛区】​2022高教社杯全国大学生数学建模竞赛获奖人员名单公示
  20. usaco 2012 Open【Running Laps奶牛赛跑】

热门文章

  1. 需要用到焊接技术的行业有哪些
  2. 快讯 | 三创文创项目参展清华文创嘉年华
  3. android 地图显示物流,离线地图
  4. 详细版【全连接前馈神经网络】(邱锡鹏)
  5. 2012年北航研究生入学考试机试题
  6. 09 | 设计模式之美——王争
  7. PPT文件如何转成PDF格式?一招教你搞定
  8. Python中用PIL/Pillow裁剪图片
  9. jaVa工程师朱璇_音量控制器下载
  10. BIOS和DOS中断大全