`

go动态调用方法

    博客分类:
  • go
 
阅读更多
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动态调用方法

    ### Golang 反射 Reflect 动态调用方法详解 #### 一、引言 反射是许多现代编程语言中的一项重要特性,它允许程序在运行时检查和操作自身的内部结构。Go 语言同样具备这样的能力,它通过 `reflect` 包提供了一套...

    golang调用 xx.so 动态库 DEMO sdk.tar

    编译一个 xx.so 动态库,使用cgo调用so库输入和输出数据。 开发环境: golang调用 xx.so 动态库 DEMO, Centos7, go1.14.4

    Golang如何调用Python代码详解

    Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 go 中的 cgo 模块...

    go调用c动态库dll源码demo

    在Golang中调用C语言编写的动态库(.dll文件)是通过cgo工具实现的,这使得Go语言能够利用C库的强大功能。本文将详细介绍如何使用Golang调用C动态库,并提供一个实际的示例。 首先,我们需要了解cgo。cgo是Go语言的...

    HCNetSDK_海康_Go_go调用海康sdk_go_

    本项目主要关注如何使用Go语言调用海康威视的SDK,实现对海康设备的基本操作。在Go语言中,通过调用C/C++库来实现对海康SDK的接口调用是一种常见的方法。 首先,我们需要理解Go语言的C语言绑定(cgo)机制。cgo允许...

    golang调用c++DLL传递char*型参数读取返回char*字符串内容

    golang调用c++DLL返回值为char*参数为const char*,读取返回DLL返回值,传递char*型参数

    golang与java间的json-rpc跨语言调用需要的jar

    本话题聚焦于Golang(Go语言)与Java之间的JSON-RPC(JSON Remote Procedure Call)通信,这是一种轻量级的远程调用协议,通过JSON(JavaScript Object Notation)作为数据交换格式来实现。在这个场景下,我们主要...

    GO语言调用C++静态库.rar

    windows开发环境goLand开发工具调用gcc、g++编译生成的静态库文件 使用gcc对.cpp文件编译生成.o文件、g++对.c文件编译生成.o文件 执行命令ar -crsv libhello.a *.o生成.a静态库文件

    go调用c++类接口

    在C++中定义一个类,并声明公有方法,这些方法将被Go语言调用。确保C++类的设计尽可能地遵循C的风格,避免使用C++特有的特性如虚函数、模板等,因为这些特性可能在生成接口时造成问题。 例如,我们可以创建一个简单...

    Go-Gocyto-Go的调用图(Callgraph)分析和可视化

    在Go编程语言中,理解和分析程序的调用关系对于优化代码、排查问题和理解系统运行逻辑至关重要。"Go-Gocyto-Go的调用图(Callgraph)分析和可视化"是针对Go程序的一种高级调试和分析工具,它可以帮助开发者更直观地...

    golang的调用shell的库go-sh.zip

    go-sh是一个golang的调用shell的库。 使用linux的人都知道shell脚本有它难以取代的优势,用2个词形容就是,简单、粗暴。但是shell有不少的坑,很容易就写的换个机器就不能使了。golang的优势很明显,写出来的代码...

    gra-GO.rar_Go_ Go_ Go!_go调用C#

    _go调用C#" 指的是一个关于Go语言(Golang)与C#交互的项目,可能是一个五子棋游戏(gomoku game),其中Go语言作为主要开发语言,而C#可能是用于特定功能或者界面的实现。 【描述】"gomoku game in csharp, c#" ...

    Go-go-ole-golang的Win32OLE实现

    【描述】"go-ole - golang的Win32 OLE实现"揭示了`go-ole`库是Go语言中对Win32 OLE接口的封装,目的是为了让Go开发者能方便地调用和控制那些基于COM接口的Windows系统服务或应用程序。通过这个库,开发者可以创建、...

    JNI调用第三方动态库

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统级API或者利用已有的C/C++库。本教程将深入探讨如何在Android...

    go和c相互调用,Golang与DLL交互

    本文将详细探讨如何使用Golang(Go语言)与C语言编写的动态链接库(DLL)进行交互,这对于实现特定功能或者利用已有的C库资源至关重要。 首先,我们需要了解Golang的`cgo`工具,它是Go语言标准库的一部分,允许Go...

    Jni-Golang:java调用golang(通过Go1.5共享库)

    Java 和 Golang 都是现代编程语言,各自拥有独特的优点。在特定场景下,开发者...然而,需要注意的是,跨语言调用会增加系统的复杂性,可能会导致额外的内存管理和性能开销。在实际应用中,需要根据具体需求权衡利弊。

    go语言程序调用c++可执行程序并传参示例

    通过这种方式,你可以使用Go语言调用C++编写的可执行程序,实现了不同编程语言间的协同工作。这种方法在处理系统级任务、利用现有C++库或者结合两种语言的优点时非常有用。然而,需要注意的是,跨语言调用可能会引入...

    Go 语言 串口驱动(linux)

    Go语言本身并不直接提供串口操作的内置库,但我们可以利用C语言的`<termios.h>`头文件,通过Go的cgo工具来调用这些C接口。cgo允许Go代码与C代码交互,使我们能够访问到Linux内核提供的串口API。 首先,我们需要创建...

Global site tag (gtag.js) - Google Analytics