我并不是要求让golang在当前上下文中做某种 "eval",只是需要它把一个输入字符串(比如说,从网络中接收到的)作为一个独立的golang程序来执行。
理论上,当你运行 go run testme.go
的内容,它将读取 testme.go
成一个字符串,并对其进行解析、编译和执行。不知道能不能直接调用go函数来执行字符串。注意,我有一个要求,就是不要把字符串写进文件。
UPDATE1
我很想知道是否有一个函数(在某个go包中)可以作为go的入口,换句话说,我可以用一个字符串作为参数来调用这个函数,它的行为就像 go run testme.go
,其中testme.go有该字符串的内容。
AFAIK这是不可能的,go编译器必须编写中间文件,所以即使你使用了 go run
而不是 go build
文件是为了运行代码而创建的,只是在必要时进行清理。所以,你不可能在不接触磁盘的情况下运行go程序,即使你设法让编译器不从文件中获取源代码。
例如,运行 strace
呼叫 go run
在一个简单的hello world程序上,显示出以下几行字。
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在幕后做了大量的磁盘写入工作, 只是在事后进行清理.
我想如果你愿意的话,可以挂载一些tmpfs,然后建立在里面,但除此之外,我相信是不可能的。
我知道这个问题已经是(5年前)的问题了,但我想说的是,其实现在已经可以实现了,供大家寻找最新的答案。
Golang编译器本身是用Go编写的,所以理论上可以嵌入Go程序中。不过这将是相当复杂的。
作为一个更好的选择,有一些项目,比如 yaegi 它实际上是一个可以嵌入到Go程序中的Go解释器。