首先对不起可能是一个糟糕的标题 - 我想我遇到的很多困难与不知道我想要实现的目标的正确术语有关。
在Go中,我希望有一个程序,在运行时可以动态创建二级二进制文件。用一个基本的hello world例子说明 - 伪代码,因为我不知道如何实现它。
generator.go
-> Read in statement from statement.txt (i.e. "Hello World")
-> Insert this statement into the following program...
package main
import (
"fmt"
)
func main(){
fmt.Println([dynamic statement inserted here])
}
-> compile this code into subprogram
每当执行go run generator.go
时,都会创建一个subprogram
二进制文件。运行此将输出Hello World
。将statement.txt更改为其他内容并再次执行go run generator.go
将再次创建subprogram
,在运行时将执行新语句。
总结
使用Go,我如何创建一个可以动态创建已编译的子程序作为输出的程序。
感谢。
答案 0 :(得分:6)
所以你有两个子任务,它们一起做你想要的:
第一个可以使用text/template
包轻松完成。您可以将源模板作为单独的单个文件,也可以嵌入主Go源(例如const
)。
您可以构建/解析源代码模板并获取Template
,例如template.ParseFiles()
或使用template.New().Parse()
。获得模板后,组装(例如从文件加载)要包含在源模板中的值并执行它,例如与Template.Execute()
。你现在有了最终的来源。
text/template
包为您提供了强大的模板引擎,它不仅仅是文本替换。
注意:在go
的子包中,您可以使用标准库中实现并使用Go解析器,但使用text/template
包非常简单并且看起来足够完美,适合你的情况。
要将最终源编译为可执行二进制文件,需要编译器的帮助。您可以使用os/exec
包来调用将生成二进制文件的编译器。请参阅exec.Command()
功能获取Cmd
,Cmd.Run()
和Cmd.Start()
执行此功能。