## 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)

Go语言反射之反射调用的更多相关文章

  1. 用C#通过反射实现动态调用WebService 告别Web引用

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

  2. Go语言备忘录:反射的原理与使用详解

    目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能   1.预备知识: Go的变量都是静态类 ...

  3. Go语言基础之反射

    Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...

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

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

  5. Java程序语言的后门-反射机制

    在文章JAVA设计模式-动态代理(Proxy)示例及说明和JAVA设计模式-动态代理(Proxy)源码分析都提到了反射这个概念. // 通过反射机制,通知力宏做事情 method.invoke(obj ...

  6. GO学习-(17) Go语言基础之反射

    Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...

  7. Go语言系列之反射

    变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量 ...

  8. 反射(4)反射性能问题:直接调用vs反射调用

    很多人都说使用反射会有性能问题,那到底会比直接调用慢多少呢,下面就来测试一下. 直接调用vs反射调用 下面就来写个demo来验证下直接调用和反射调用的性能差异,代码如下: namespace Cons ...

  9. go语言中的反射reflect

    package main; import ( "fmt" "reflect" ) //反射refection //反射使用TypeOf和ValueOf函数从接口 ...

  10. tp 框架 利用反射实现对象调用方法

    <?php class Person{ public $name="xiaoming"; function say(){ echo "i am ".$th ...

随机推荐

  1. Python初学者第十三天 三级菜单程序小作业

    13day 作业题目: 三级菜单 作业需求: 数据结构: menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{}, '网易':{}, 'google':{} }, '中关村' ...

  2. Java 字符流与基本IO

    字符流基类 java.io包中专门用于字符流处理的类,是以 Reader 和 Writer 为基础派生的一系列类.字符流以字符为单位,根据码表映射字符,一次可能读多个字节,只能处理字符类型的数据.Re ...

  3. scala当中的文件操作和网络请求

    1.读取文件当中每一行的数据 def main(args: Array[String]): Unit = { //注意文件的编码格式,如果编码格式不对,那么读取报错 val file: Buffere ...

  4. svg压缩工具svgo安装使用

    svgo是基于node.js的插件,所以需要先安装node.js 1.安装完node.js后,打开node.js命令窗口,输入npm install -g svgo,安装成后会出现下边的内容 2.对s ...

  5. mysql 聚集和非聚集索引 解析

    一.聚集索引(聚簇索引) 1. 什么是聚集索引? 比如要查找'hello',则直接找内容为hello的行,我们把这种正文内容本身就是一种按照一定规则排列的目录称为“聚集索引”.   聚集索引的叶子节点 ...

  6. 【LGP2045】方格取数加强版

    题目 还纠结了一下是费用流还是最小割 最终还是决定让最小割去死吧 我们的问题就是让一个点的点权只被计算一次 考虑拆点 将所有点拆成入点和出点,入点向出点连流量为\(1\)的边 每一个出点往下连能到达的 ...

  7. 【[SDOI2009]Elaxia的路线】

    魏佬告诉我跑得快不一定赢,不跌跟头才是成功 我决定把这句话作为魏佬的名言记下来 等以后人人捧着魏佬语录的时候,我可以告诉他们魏佬从小就开始向我传授人生经验 但我就是跑的快,而且非常快 成功卡到了b站最 ...

  8. luogu P1262 间谍网络

    嘟嘟嘟 建图还是很明显的. 接着分两种情况: 1.图中不存在环:那么只要收买那些入度为0的点.如果这些点有的不能收买.就不能控制所有间谍. 2.图中存在环,那么对于这些在环中的点,我们只要收买数额最少 ...

  9. weblogic之CVE-2016-0638反序列化分析

    此漏洞是基于CVE-2015-4852漏洞进行黑名单的绕过,CVE-2015-4852补丁主要应用在三个位置上 weblogic.rjvm.InboundMsgAbbrev.class :: Serv ...

  10. On Java 8中文版 英雄召集令

    这是该项目的GITHUB地址:https://github.com/LingCoder/OnJava8 广招天下英雄,为开源奉献!让我们一起来完成这本书的翻译吧! 如果您在阅读本书的过程中有发现不明白 ...