使用go动态创建编译的二进制文件

时间:2015-05-15 11:54:26

标签: dynamic go compilation dynamically-generated

首先对不起可能是一个糟糕的标题 - 我想我遇到的很多困难与不知道我想要实现的目标的正确术语有关。

在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,我如何创建一个可以动态创建已编译的子程序作为输出的程序。

感谢。

1 个答案:

答案 0 :(得分:6)

所以你有两个子任务,它们一起做你想要的:

  1. 执行文本替换以获取最终源代码。
  2. 将最终源代码编译为可执行二进制文件。
  3. 1。文字替换

    第一个可以使用text/template包轻松完成。您可以将源模板作为单独的单个文件,也可以嵌入主Go源(例如const)。

    您可以构建/解析源代码模板并获取Template,例如template.ParseFiles()或使用template.New().Parse()。获得模板后,组装(例如从文件加载)要包含在源模板中的值并执行它,例如与Template.Execute()。你现在有了最终的来源。

    text/template包为您提供了强大的模板引擎,它不仅仅是文本替换。

    注意:go的子包中,您可以使用标准库中实现并使用Go解析器,但使用text/template包非常简单并且看起来足够完美,适合你的情况。

    2。编译

    要将最终源编译为可执行二进制文件,需要编译器的帮助。您可以使用os/exec包来调用将生成二进制文件的编译器。请参阅exec.Command()功能获取CmdCmd.Run()Cmd.Start()执行此功能。