为了账号安全,请及时绑定邮箱和手机立即绑定

如何将名称 FUNCTION 放宽为变量

如何将名称 FUNCTION 放宽为变量

Go
森林海 2023-06-01 15:20:18
我用 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 variabletype Xinterface interface {    FUNCTION(x int, y int) int}用法示例:$ go run forbasile.go SUM 'return x+y' 3 5func(s sum) FUNCTION (x int, y int) int { start of sum: x=3, y=5131 bytes written successfully/tmp/go-build104174513/b001/execompiling plugin[]loading modulelooking up symbolchecking module8Generated code: /tmp/SUM.goGenerated object file: /tmp/SUM.so$ go run forbasile.go SUMSQUARE 'return x*x + y*y' 3 4func(s sumsquare) FUNCTION (x int, y int) int { start of sumsquare: x=3, y=4161 bytes written successfully/tmp/go-build555823501/b001/execompiling plugin[]loading modulelooking up symbolchecking module25Generated code: /tmp/SUMSQUARE.goGenerated object file: /tmp/SUMSQUARE.so
查看完整描述

1 回答

?
侃侃无极

TA贡献2051条经验 获得超10个赞

godoc

Symbol 是指向变量或函数的指针。

例如,一个插件定义为

package main


import "fmt"


func F() { fmt.Printf("Hello, number %d\n", V) }

可以加载Open函数,然后可以访问导出的包符号V和F


p, 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”只是一个字符串,因此您无论如何都可以在运行时更改它的值。


查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信