如何让golang执行一个字符串

问题描述 投票:2回答:2

我并不是要求让golang在当前上下文中做某种 "eval",只是需要它把一个输入字符串(比如说,从网络中接收到的)作为一个独立的golang程序来执行。

理论上,当你运行 go run testme.go的内容,它将读取 testme.go 成一个字符串,并对其进行解析、编译和执行。不知道能不能直接调用go函数来执行字符串。注意,我有一个要求,就是不要把字符串写进文件。

UPDATE1

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

go
2个回答
4
投票

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,然后建立在里面,但除此之外,我相信是不可能的。


0
投票

我知道这个问题已经是(5年前)的问题了,但我想说的是,其实现在已经可以实现了,供大家寻找最新的答案。

Golang编译器本身是用Go编写的,所以理论上可以嵌入Go程序中。不过这将是相当复杂的。

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

© www.soinside.com 2019 - 2024. All rights reserved.