我不是要让 golang 在当前上下文中执行某种“eval”,只需要它获取输入字符串(比如,从网络接收)并将其作为单独的 golang 程序执行。
理论上,当你运行go run testme.go
时,它会将testme.go
的内容读取成一个字符串,然后解析、编译并执行。想知道是否可以调用一个go函数直接执行一个字符串。请注意,我要求不要将字符串写入文件。
更新1
我真的很想知道是否有一个函数(在一些 go 包中)作为 go 的入口点,换句话说,我可以用一个字符串作为参数调用这个函数,它的行为就像 go run testme.go
,其中 testme.go 包含该字符串的内容。
最佳答案
据我所知,它无法完成,go 编译器必须编写中间文件,所以即使您使用 go run
而不是 go build
,也会为为了运行代码,它们只是在必要时清理。所以你不能在不接触磁盘的情况下运行 go 程序,即使你设法以某种方式让编译器从文件中获取源代码也是如此。
例如,在一个简单的 hello world 程序上调用 go run
时运行 strace
会显示以下行:
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 并在其中构建,但除此之外我认为这是不可能的。
关于go - 如何让golang执行一个字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28783637/