func CallMethod(i interface{}, methodName string) interface{} {
var ptr reflect.Value
var value reflect.Value
var finalMethod reflect.Value
value = reflect.ValueOf(i)
// if we start with a pointer, we need to get value pointed to
// if we start with a value, we need to get a pointer to that value
if value.Type().Kind() == reflect.Ptr {
ptr = value
value = ptr.Elem()
} else {
ptr = reflect.New(reflect.TypeOf(i))
temp := ptr.Elem()
temp.Set(value)
}
// check for method on value
method := value.MethodByName(methodName)
if method.IsValid() {
finalMethod = method
}
// check for method on pointer
method = ptr.MethodByName(methodName)
if method.IsValid() {
finalMethod = method
}
if (finalMethod.IsValid()) {
return finalMethod.Call([]reflect.Value{})[0].Interface()
}
// return or panic, method not found of either type
return ""
}
func (ubidreq *Ubidrequest) GetDid() (str_did string){
method_name := "Get"+CurrentMedia+"Did" //CurrentMidia == tencent
str_ret := CallMethod(ubidreq, method_name).(string)
return str_ret
}
某个地方定义了一个方法
func (ubidreq *Ubidrequest) GettencentDid() (string) {
................
}
第一个参数 方法的类型,第二个参数为方法的名。返回参数可以是.(string) .(bool) .([]string) 毕竟动态的方法返回的是一个interface{}
具体例子:
type Person struct{
Name string
Age int64
}
func (p *Person)GetName()(ret string){
ret = p.Name
return
}
func main() {
hhg := Person{"hhg08",222}
method_name := "Get"+"Name"
name := CallMethod(hhg,method_name).(string)
fmt.Println(name)
}
结果:
hhg08
http://stackoverflow.com/questions/14116840/dynamically-call-method-on-interface-regardless-of-receiver-type
分享到:
相关推荐
### Golang 反射 Reflect 动态调用方法详解 #### 一、引言 反射是许多现代编程语言中的一项重要特性,它允许程序在运行时检查和操作自身的内部结构。Go 语言同样具备这样的能力,它通过 `reflect` 包提供了一套...
编译一个 xx.so 动态库,使用cgo调用so库输入和输出数据。 开发环境: golang调用 xx.so 动态库 DEMO, Centos7, go1.14.4
Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 go 中的 cgo 模块...
在Golang中调用C语言编写的动态库(.dll文件)是通过cgo工具实现的,这使得Go语言能够利用C库的强大功能。本文将详细介绍如何使用Golang调用C动态库,并提供一个实际的示例。 首先,我们需要了解cgo。cgo是Go语言的...
本项目主要关注如何使用Go语言调用海康威视的SDK,实现对海康设备的基本操作。在Go语言中,通过调用C/C++库来实现对海康SDK的接口调用是一种常见的方法。 首先,我们需要理解Go语言的C语言绑定(cgo)机制。cgo允许...
golang调用c++DLL返回值为char*参数为const char*,读取返回DLL返回值,传递char*型参数
本话题聚焦于Golang(Go语言)与Java之间的JSON-RPC(JSON Remote Procedure Call)通信,这是一种轻量级的远程调用协议,通过JSON(JavaScript Object Notation)作为数据交换格式来实现。在这个场景下,我们主要...
windows开发环境goLand开发工具调用gcc、g++编译生成的静态库文件 使用gcc对.cpp文件编译生成.o文件、g++对.c文件编译生成.o文件 执行命令ar -crsv libhello.a *.o生成.a静态库文件
在C++中定义一个类,并声明公有方法,这些方法将被Go语言调用。确保C++类的设计尽可能地遵循C的风格,避免使用C++特有的特性如虚函数、模板等,因为这些特性可能在生成接口时造成问题。 例如,我们可以创建一个简单...
在Go编程语言中,理解和分析程序的调用关系对于优化代码、排查问题和理解系统运行逻辑至关重要。"Go-Gocyto-Go的调用图(Callgraph)分析和可视化"是针对Go程序的一种高级调试和分析工具,它可以帮助开发者更直观地...
go-sh是一个golang的调用shell的库。 使用linux的人都知道shell脚本有它难以取代的优势,用2个词形容就是,简单、粗暴。但是shell有不少的坑,很容易就写的换个机器就不能使了。golang的优势很明显,写出来的代码...
_go调用C#" 指的是一个关于Go语言(Golang)与C#交互的项目,可能是一个五子棋游戏(gomoku game),其中Go语言作为主要开发语言,而C#可能是用于特定功能或者界面的实现。 【描述】"gomoku game in csharp, c#" ...
【描述】"go-ole - golang的Win32 OLE实现"揭示了`go-ole`库是Go语言中对Win32 OLE接口的封装,目的是为了让Go开发者能方便地调用和控制那些基于COM接口的Windows系统服务或应用程序。通过这个库,开发者可以创建、...
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统级API或者利用已有的C/C++库。本教程将深入探讨如何在Android...
本文将详细探讨如何使用Golang(Go语言)与C语言编写的动态链接库(DLL)进行交互,这对于实现特定功能或者利用已有的C库资源至关重要。 首先,我们需要了解Golang的`cgo`工具,它是Go语言标准库的一部分,允许Go...
Java 和 Golang 都是现代编程语言,各自拥有独特的优点。在特定场景下,开发者...然而,需要注意的是,跨语言调用会增加系统的复杂性,可能会导致额外的内存管理和性能开销。在实际应用中,需要根据具体需求权衡利弊。
通过这种方式,你可以使用Go语言调用C++编写的可执行程序,实现了不同编程语言间的协同工作。这种方法在处理系统级任务、利用现有C++库或者结合两种语言的优点时非常有用。然而,需要注意的是,跨语言调用可能会引入...
Go语言本身并不直接提供串口操作的内置库,但我们可以利用C语言的`<termios.h>`头文件,通过Go的cgo工具来调用这些C接口。cgo允许Go代码与C代码交互,使我们能够访问到Linux内核提供的串口API。 首先,我们需要创建...