我不是要让golang做某种" eval"在当前上下文中,只需要它获取输入字符串(例如,从网络接收)并将其作为单独的golang程序执行。
理论上,当您运行go run testme.go
时,它会将testme.go
的内容读入字符串并解析,编译并执行它。不知道是否可以调用go函数直接执行字符串。请注意,我要求不将字符串写入文件。
UPDATE1
我真的想知道是否有一个函数(在一些go包中)作为go的入口点,换句话说,我可以用字符串作为参数来调用这个函数,它的行为就像{{ 1}},其中testme.go包含该字符串的内容。
答案 0 :(得分:4)
AFAIK无法完成,并且go编译器必须编写中间文件,因此即使您使用go run
而不是go build
,也会为了运行代码而创建文件,它们是如有必要,请尽快清理干净因此,即使您设法使编译器不是从文件中获取源代码,也无法在不触及磁盘的情况下运行go程序。
例如,在简单的hello world程序上调用strace
时运行go run
,除其他外,显示以下几行:
mkdir("/tmp/go-build167589894", 0700)
// ....
mkdir("/tmp/go-build167589894/command-line-arguments/_obj/exe/", 0777)
// ... and at the end of things
unlink("/tmp/go-build167589894/command-line-arguments/_obj/exe/foo")
// ^^^ my program was called foo.go
// ....
// and eventually:
rmdir("/tmp/go-build167589894")
所以你可以看到go run在幕后写了很多磁盘,之后就清理了。
我想如果你愿意的话,你可以安装一些tmpf并构建它,但除此之外我不相信它是可能的。
答案 1 :(得分:2)
我知道这个问题已有5年之久,但我想说的是,实际上,对于任何寻求最新答案的人来说,现在都有可能。
Golang编译器本身是用Go编写的,因此理论上可以嵌入Go程序中。但是,这将非常复杂。
作为更好的选择,有yaegi之类的项目实际上是可以嵌入Go程序的Go解释器。