Go语言反射之反射调用
## 1 概述
利用反射,不仅可以获取信息,还可以创建实例,执行函数和方法。就是反射代理执行。
<!-- more -->
## 2 创建实例
创建实例的前提是具有 `reflect.Type` 对象,基于此创建实例。使用 `reflect.TypeOf()` 函数,可以获取得到某类型的 `reflect.Type` 对象,演示如下:
```go
typeStu := reflect.TypeOf(Stu{})
s := reflect.New(typeStu)
s.Elem().FieldByName("Name").SetString("Hank") // 利用反射设置结构体字段值
fmt.Println(s.Elem().FieldByName("Name").String()) // Hank
```
我们创建了实例,一直都是通过反射的方式操作的。
## 3 调用函数
如果值反射对象 `reflect.Value` 反射的是函数时,可以通过 `reflect.Value` 调用该函数。使用反射调用函数时,需要将参数使用反射值对象的切片 `[]reflect.Value` 构造后传入 `Call()` 方法中传参。调用完成时,函数的返回值通过 `[]reflect.Value` 返回。
演示如下:
```go
func fn(p1, p2 int) int {
return p1 + p2
}
func main() {
valueFunc := reflect.ValueOf(fn)
paramList := []reflect.Value{
reflect.ValueOf(22),
reflect.ValueOf(20),
}
// 反射调用函数
resultList := valueFunc.Call(paramList)
// 获取第一个返回值, 取整数值
fmt.Println(resultList[0].Int()) // 42
}
```
## 4 调用方法
整体与调用函数一致,额外的需要先通过对象的值反射获取对象方法的反射对象,再使用 `Call()` 调用,示例:
```go
type Stu struct {
Name string
}
func (this *Stu) Fn(p1, p2 int) int {
return p1 + p2
}
func main() {
s := &Stu{"Hank"}
valueS := reflect.ValueOf(s)
method := valueS.MethodByName("Fn")
paramList := []reflect.Value{
reflect.ValueOf(22),
reflect.ValueOf(20),
}
resultList := method.Call(paramList)
fmt.Println(resultList[0].Int()) // 42
}
```
完!
原文出自:[小韩说课](http://www.hellokang.net/go/go-reflect-inoke/)
微信关注:小韩说课
![小韩说课](http://www.hellokang.net/images/wechat_subscription.jpg)
转载于:https://www.cnblogs.com/hanzk/p/9922614.html
Go语言反射之反射调用相关推荐
- JAVA语言中的反射机制
在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法? 对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的信息,以及动态调用类的方法的功能来源于JAV ...
- Go语言类库-reflect(反射)
概述 什么是反射? 反射是计算机程序在运行时可以访问,检查和修改本身状态或者行为的一种能力,大多数编程语言都支持反射.Go语言中,使用反射可以在程序执行过程中更新变量和检查对象的属性,调用对象的方法. ...
- java lambda 反射_反射调用与Lambda表达式调用
想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用--至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验 ...
- vue 调用webservice_用C#通过反射实现动态调用WebService 告别Web引用(转载)
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- Java回调的四种写法(反射、直接调用、接口调用、Lamda表达式)
1. 引言 在计算机程序设计中,回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 以上是维基百科对&qu ...
- go interface转int_24. 图解 Go语言中的反射三定律
大家好,我是明哥. 由于某些不可抗力,之前该专栏的所有内容都被删除了.因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒. 本文原文:http://golang.iswbm.com ...
- 反射实现方法调用(1):执行机制
1. 反射简介 2. 使用反射 3. 反射调用方法的执行机制 1. 反射简介 程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类 ...
- 2:什么是反射与反射的应用及调用方法(by-朝夕)
什么是反射与反射的应用及调用方法 前言 为什么学习反射 1.反射创建对象 2.反射调用方法 3.反射调用带参数构造方法 4.反射调用方法 5.反射调用泛型类+泛型方法 6.反射的性能问题 7.反射在框 ...
- java 反射 对象的方法_java通过反射创建对象并调用方法
这篇文章主要介绍了java通过反射创建对象并调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.用户类 package com.lf.ent ...
- java 反射setter_Java反射机制-调用setter及getter方法
回应面向对象部分的强调:"类中的属性必须封装,封装后的属性要通过setter和getter方法设置和取得".那么在使用反射机制进行调用方法操作时, 最重要的调用类中的setter和 ...
最新文章
- C/C++结构体字节对齐详解
- 盘点2020国内本科开设人工智能专业高校
- [css] 举例说明background-repeat的新属性值:round和space的作用是什么?
- 信息学奥赛C++语言:乘车费用
- jquery-节点操作
- mysql olap 函数_Mysql中的窗口函数
- 泰安机器人比赛_泰安学子在省青少年机器人竞赛上揽8个一等奖
- Centos6.4安装jdk
- 【04】Kubernets:资源清单(pod)
- Redis Java实例
- 计算机VFP基础知识,计算机二级《VFP》考试基础知识:VisualFoxPro基础
- 云场景实践研究第79期:熊猫直播
- 计算机网络一般包括资源子网和什么两部分,一个计算机网络一般包括什么和通信子网两部分...
- spring cloud day(6) gateway网关
- ios输入框被软键盘遮住问题
- java闪烁的星空_PS制作出闪烁的星空gif动态图
- 递归来实现一个二分查找算法函数bi_search()
- 刚挣钱的程序猿同学该怎样花钱?
- 服务器上安装安卓系统教程,云服务器上安装安卓系统
- 《中国聚合支付行业发展报告2018》发布 深度分析未来八大趋势
热门文章
- binarytreenode”使用 类 模板 需要 模板 参数列表_0基础掌握Django框架(7)Django模板介绍...
- python自动化框架pytest接口关联串联_python(pytest)+allure+jenkins 实现接口自动化的思路...
- iframe 禁止打开新窗口_打开新窗口的安全和性能问题
- python+Django 完成第一个后端项目--创建投票应用(一)
- 用thymeleaf转化日期格式的方法
- pythonseleniumide使用_selenium第二课(脚本录制seleniumIDE的使用)
- 传智播客python2018_Python视频教程下载-2018传智播客Python视频教程下载-西西软件下载...
- linux dpkg未找到命令_Linux安装软件时90%的人会遇到这个报错,如何解决?
- linux中兴上网客户端,中兴新支点N-Print,简单高效Linux桌面操作系统网络打印方案...
- 新手学java 学哪方面_初学者学Java应从哪些方面学习?