Golang Go语言如何动态调用函数?
项目需求是通过 golang 编写一 framework (看重 go 的高并发), framework 为插件化,某一包(目录)下放置插件,插件更新频率很高。问题是,在不知道插件名(文件名)的情况下怎样才能动态的调用插件?没有找到怎么用 go 实现… 现在的想法是插件用 python 开发,然后 go 遍历插件目录进行调用。
忘指教
Golang Go语言如何动态调用函数?
go 是静态语言!!!是需要编译的!!!是不能更改运行时的!!
只能用父进程监控文件变化,重新编译,杀掉原有子进程,然后启动。
更多关于Golang Go语言如何动态调用函数?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go 插件编译成动态链接库暴露固定的接口, 主程序里通过 cgo 用 dlopen 、 dlsym 这些调用这个接口, 但是感觉会不会太坑…
反射可以实现。
我 google 了下 不能反射包呀?
如果你可以实现知道哪些函数要被执行,可以用字符串查找来通过反射执行。。
go 是静态编译的,不适合实现插件机制,或集成 lua 试下: https://github.com/yuin/gopher-lua
包必须要先引入。
https://golang.org/pkg/reflect/ 反射模块可以提供一定程度上的运行时类型信息
做成 dll
四种好用的方法: 1 , RPC 。 2 , template 。 3 , reflect 。 4 , http
在Go语言中,动态调用函数通常涉及反射(reflection)机制。Go的反射包reflect
允许程序在运行时检查变量的类型和值,以及调用它们的方法或函数。
要实现动态函数调用,你可以使用reflect.ValueOf
获取函数的反射值,然后使用Call
方法调用该函数。这里是一个基本示例:
package main
import (
"fmt"
"reflect"
)
func add(a, b int) int {
return a + b
}
func main() {
// 获取add函数的反射值
fn := reflect.ValueOf(add)
// 准备输入参数,必须是[]reflect.Value类型
args := []reflect.Value{reflect.ValueOf(3), reflect.ValueOf(4)}
// 调用函数,返回[]reflect.Value类型的结果
results := fn.Call(args)
// 处理结果
if len(results) > 0 {
fmt.Println("Result:", results[0].Int())
}
}
在这个例子中,add
函数被动态调用,并传递了两个整数参数。Call
方法返回一个[]reflect.Value
,包含了函数的返回值。你可以通过索引访问这些返回值,并使用相应的类型转换方法(如Int()
)来获取具体的值。
请注意,反射虽然强大,但会牺牲一定的性能,并且在编译时不会进行类型检查,因此应谨慎使用,通常只在需要高度灵活性的场景下采用。