Golang Go语言如何动态调用函数?

项目需求是通过 golang 编写一 framework (看重 go 的高并发), framework 为插件化,某一包(目录)下放置插件,插件更新频率很高。问题是,在不知道插件名(文件名)的情况下怎样才能动态的调用插件?没有找到怎么用 go 实现… 现在的想法是插件用 python 开发,然后 go 遍历插件目录进行调用。
忘指教
Golang Go语言如何动态调用函数?

12 回复

go 是静态语言!!!是需要编译的!!!是不能更改运行时的!!

只能用父进程监控文件变化,重新编译,杀掉原有子进程,然后启动。

更多关于Golang Go语言如何动态调用函数?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


或者问题可以转化成:怎么获取一个包中的所有 struct ?

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())来获取具体的值。

请注意,反射虽然强大,但会牺牲一定的性能,并且在编译时不会进行类型检查,因此应谨慎使用,通常只在需要高度灵活性的场景下采用。

回到顶部