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/)
微信关注:小韩说课

Go语言反射之反射调用的更多相关文章
- 用C#通过反射实现动态调用WebService 告别Web引用
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- Go语言备忘录:反射的原理与使用详解
目录: 预备知识 reflect.Typeof.reflect.ValueOf Value.Type 动态调用 通过反射可以修改原对象 实现类似“泛型”的功能 1.预备知识: Go的变量都是静态类 ...
- Go语言基础之反射
Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...
- 用C#通过反射实现动态调用WebService 告别Web引用(转载)
我们都知道,调用WebService可以在工程中对WebService地址进行WEB引用,但是这确实很不方便.我想能够利用配置文件灵活调用WebService.如何实现呢? 用C#通过反射实现动态调用 ...
- Java程序语言的后门-反射机制
在文章JAVA设计模式-动态代理(Proxy)示例及说明和JAVA设计模式-动态代理(Proxy)源码分析都提到了反射这个概念. // 通过反射机制,通知力宏做事情 method.invoke(obj ...
- GO学习-(17) Go语言基础之反射
Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...
- Go语言系列之反射
变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指在程序运行期对程序本身进行访问和修改的能力.程序在编译时,变量 ...
- 反射(4)反射性能问题:直接调用vs反射调用
很多人都说使用反射会有性能问题,那到底会比直接调用慢多少呢,下面就来测试一下. 直接调用vs反射调用 下面就来写个demo来验证下直接调用和反射调用的性能差异,代码如下: namespace Cons ...
- go语言中的反射reflect
package main; import ( "fmt" "reflect" ) //反射refection //反射使用TypeOf和ValueOf函数从接口 ...
- tp 框架 利用反射实现对象调用方法
<?php class Person{ public $name="xiaoming"; function say(){ echo "i am ".$th ...
随机推荐
- cp 复制不覆盖
awk 'BEGIN { cmd="cp -ri a1/* a2/"; print "n" |cmd; }'
- 获得用户完整的autodiscover配置文件
outlook 2016 无法自定义配置exchange邮箱,需要使用自动发现来配置,但在配置过程中,经常出现异常的错误,导致无法通过. 之前的文章介绍了通过使用注册表指定autodiscover.x ...
- HTML简单框架网页制作 吴昊
- MySQL5.7 不同操作系统下的主从配置
1. 服务器信息 1.1 Ubuntu 17.0.4 (Master服务器) MySQL版本: 5.7.20 主数据库:dslbcp IP: 192.168.12.130 3306 1.2 Wind ...
- codeforces A. Supercentral Point 题解
版权声明:本文作者靖心,靖空间地址:http://blog.csdn.net/kenden23/,未经本作者同意不得转载. https://blog.csdn.net/kenden23/article ...
- Vue学习—Vue写一个图片轮播组件
1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内 ...
- Asp.net MVC使用FormsAuthentication,MVC和WEB API可以共享身份认证 (转载)
在实际的项目应用中,很多时候都需要保证数据的安全和可靠,如何来保证数据的安全呢?做法有很多,最常见的就是进行身份验证.验证通过,根据验证过的身份给与对应访问权限.同在Web Api中如何实现身份认证呢 ...
- 使用java代码将时间戳和时间互相转换
时间戳转时间: SimpleDateFormat simpleDateFormat = null; simpleDateFormat = new SimpleDateFormat("yyyy ...
- eclipse删除的文件如何恢复。
1.如果不小心删除了单个文件或者文件夹. 鼠标点击上级目录 Ctrl+z就可以恢复了. 如果没有恢复,就右击项目,选择Resore from Local History 然后选择你所删除的文件,选择恢 ...
- II、Python HelloWorld
大家都不是小孩子了,直接上 IDE 现在有个大问题!!没有解析器啊 这样 解析器地址比他多个 e OJBK