【问题标题】:how to make golang execute a string如何让golang执行一个字符串
【发布时间】:2015-02-28 15:51:36
【问题描述】:

我并不是要让 golang 在当前上下文中执行某种“评估”,只需要它获取输入字符串(例如,从网络接收)并将其作为单独的 golang 程序执行。

理论上,当你运行go run testme.go时,它会将testme.go的内容读入字符串并解析、编译并执行。想知道是否可以调用 go 函数直接执行字符串。请注意,我要求不要将字符串写入文件。

更新1

我真的很想知道是否有一个函数(在某个 go 包中)作为 go 的入口点,换句话说,我可以用一个字符串作为参数调用这个函数,它的行为就像 @987654323 @,其中 testme.go 包含该字符串的内容。

【问题讨论】:

  • 不写中间文件的要求从何而来?

标签: go


【解决方案1】:

AFAIK 做不到,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 并在其中构建,否则我不相信这是可能的。

【讨论】:

  • 感谢@Not_a_Golfer 提出使用 strace 的想法。听起来唯一的可能性是创建 ramdisk,所以 go 会将中间文件写入这些 ramdisk。想知道是否有它的包。
  • @codingFun 在最新的 linux 发行版上,/tmp 是一个 ramdisk (tmpfs)。
  • @OneOfOne:这远非普遍正确。大多数确实有一块共享内存映射到/run/shm,或者/dev/shm
  • @JimB 很高兴知道,我个人使用的是 arch 并尝试了 1 或 2 个其他的也是这样的。
  • 谢谢大家的积分。我已经用 update1 澄清了这个问题。
【解决方案2】:

我知道这个问题已经有 5 年的历史了,但我想说的是,实际上,现在对于任何寻求最新答案的人来说都是可能的。

Golang 编译器本身是用 Go 编写的,因此理论上可以嵌入到 Go 程序中。不过这会很复杂。

作为更好的选择,有像 yaegi 这样的项目,它们实际上是一个可以嵌入到 Go 程序中的 Go 解释器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 2020-02-06
    相关资源
    最近更新 更多