猿问

如何将名称 FUNCTION 放宽为变量

我用 Go 编写了一个插件生成器。回购是开放的。


该项目在一些临时文件中创建了一些 Go 代码,定义了一个从命令行参数中获取的函数,将该代码编译成一个插件,加载该插件,获取其中的函数,并使用参数调用它,然后打印结果。


我们希望能够处理多个函数和多个插件。例如,SUMbody 的函数, body 的 return x+y;函数;等等。PRODreturn x*y


我不希望生成的代码始终使用常量名称 FUNCTION。生成的 .go 文件不能包含名称在运行时给出的函数,即funame 下面代码中的 my 吗?Go 语言是否有某些功能禁止这样做?


//TODO: Investigate how to relax the name FUNCTION into a variable

type Xinterface interface {

    FUNCTION(x int, y int) int

}

用法示例:


$ go run forbasile.go SUM 'return x+y' 3 5

func(s sum) FUNCTION (x int, y int) int { 

start of sum: x=3, y=5

131 bytes written successfully

/tmp/go-build104174513/b001/exe

compiling plugin

[]

loading module

looking up symbol

checking module


8

Generated code: /tmp/SUM.go

Generated object file: /tmp/SUM.so

$ go run forbasile.go SUMSQUARE 'return x*x + y*y' 3 4

func(s sumsquare) FUNCTION (x int, y int) int { 

start of sumsquare: x=3, y=4

161 bytes written successfully

/tmp/go-build555823501/b001/exe

compiling plugin

[]

loading module

looking up symbol

checking module


25

Generated code: /tmp/SUMSQUARE.go

Generated object file: /tmp/SUMSQUARE.so


森林海
浏览 103回答 1
1回答

侃侃无极

godocSymbol 是指向变量或函数的指针。例如,一个插件定义为package mainimport "fmt"func F() { fmt.Printf("Hello, number %d\n", V) }可以加载Open函数,然后可以访问导出的包符号V和Fp, err := plugin.Open("plugin_name.so")if err != nil {    panic(err)}f, err := p.Lookup("F")if err != nil {    panic(err)}f.(func())() // prints "Hello, number 7"“F”只是一个字符串,因此您无论如何都可以在运行时更改它的值。
随时随地看视频慕课网APP

相关分类

Go
我要回答