## 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语言反射之反射调用相关推荐

  1. JAVA语言中的反射机制

    在Java 运行时 环境中,对于任意一个类,能否知道这个类有哪些属性和方法?     对于任意一个对象,能否调用他的方法?这些答案是肯定的,这种动态获取类的信息,以及动态调用类的方法的功能来源于JAV ...

  2. Go语言类库-reflect(反射)

    概述 什么是反射? 反射是计算机程序在运行时可以访问,检查和修改本身状态或者行为的一种能力,大多数编程语言都支持反射.Go语言中,使用反射可以在程序执行过程中更新变量和检查对象的属性,调用对象的方法. ...

  3. java lambda 反射_反射调用与Lambda表达式调用

    想调用一个方法很容易,直接代码调用就行,这人人都会.其次呢,还可以使用反射.不过通过反射调用的性能会远远低于直接调用--至少从绝对时间上来看的确是这样.虽然这是个众所周知的现象,我们还是来写个程序来验 ...

  4. vue 调用webservice_用C#通过反射实现动态调用WebService 告别Web引用(转载)

    我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...

  5. Java回调的四种写法(反射、直接调用、接口调用、Lamda表达式)

    1. 引言 在计算机程序设计中,回调函数,简称回调(Callback),是指通过函数参数传递到其他代码的,某一块可执行代码的引用.这一设计允许了底层代码调用在高层定义的子程序. 以上是维基百科对&qu ...

  6. go interface转int_24. 图解 Go语言中的反射三定律

    大家好,我是明哥. 由于某些不可抗力,之前该专栏的所有内容都被删除了.因此之后的一段时间内,我会重新发布这些文章,先给已经看过的关注者提个醒. 本文原文:http://golang.iswbm.com ...

  7. 反射实现方法调用(1):执行机制

    1. 反射简介    2. 使用反射 3. 反射调用方法的执行机制 1. 反射简介 程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象.您可以使用反射动态地创建类 ...

  8. 2:什么是反射与反射的应用及调用方法(by-朝夕)

    什么是反射与反射的应用及调用方法 前言 为什么学习反射 1.反射创建对象 2.反射调用方法 3.反射调用带参数构造方法 4.反射调用方法 5.反射调用泛型类+泛型方法 6.反射的性能问题 7.反射在框 ...

  9. java 反射 对象的方法_java通过反射创建对象并调用方法

    这篇文章主要介绍了java通过反射创建对象并调用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.用户类 package com.lf.ent ...

  10. java 反射setter_Java反射机制-调用setter及getter方法

    回应面向对象部分的强调:"类中的属性必须封装,封装后的属性要通过setter和getter方法设置和取得".那么在使用反射机制进行调用方法操作时, 最重要的调用类中的setter和 ...

最新文章

  1. C/C++结构体字节对齐详解
  2. 盘点2020国内本科开设人工智能专业高校
  3. [css] 举例说明background-repeat的新属性值:round和space的作用是什么?
  4. 信息学奥赛C++语言:乘车费用
  5. jquery-节点操作
  6. mysql olap 函数_Mysql中的窗口函数
  7. 泰安机器人比赛_泰安学子在省青少年机器人竞赛上揽8个一等奖
  8. Centos6.4安装jdk
  9. 【04】Kubernets:资源清单(pod)
  10. Redis Java实例
  11. 计算机VFP基础知识,计算机二级《VFP》考试基础知识:VisualFoxPro基础
  12. 云场景实践研究第79期:熊猫直播
  13. 计算机网络一般包括资源子网和什么两部分,一个计算机网络一般包括什么和通信子网两部分...
  14. spring cloud day(6) gateway网关
  15. ios输入框被软键盘遮住问题
  16. java闪烁的星空_PS制作出闪烁的星空gif动态图
  17. 递归来实现一个二分查找算法函数bi_search()
  18. 刚挣钱的程序猿同学该怎样花钱?
  19. 服务器上安装安卓系统教程,云服务器上安装安卓系统
  20. 《中国聚合支付行业发展报告2018》发布 深度分析未来八大趋势

热门文章

  1. binarytreenode”使用 类 模板 需要 模板 参数列表_0基础掌握Django框架(7)Django模板介绍...
  2. python自动化框架pytest接口关联串联_python(pytest)+allure+jenkins 实现接口自动化的思路...
  3. iframe 禁止打开新窗口_打开新窗口的安全和性能问题
  4. python+Django 完成第一个后端项目--创建投票应用(一)
  5. 用thymeleaf转化日期格式的方法
  6. pythonseleniumide使用_selenium第二课(脚本录制seleniumIDE的使用)
  7. 传智播客python2018_Python视频教程下载-2018传智播客Python视频教程下载-西西软件下载...
  8. linux dpkg未找到命令_Linux安装软件时90%的人会遇到这个报错,如何解决?
  9. linux中兴上网客户端,中兴新支点N-Print,简单高效Linux桌面操作系统网络打印方案...
  10. 新手学java 学哪方面_初学者学Java应从哪些方面学习?