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

Pel*_*eus 4 compilation dynamic go 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
Run Code Online (Sandbox Code Playgroud)

无论何时go run generator.go执行,subprogram都会创建二进制文件.运行它会输出Hello World.将statement.txt更改为其他内容并go run generator.go再次执行将再次创建subprogram在运行时将执行新语句.

综上所述

使用Go,我如何创建一个可以动态创建已编译的子程序作为输出的程序.

谢谢.

icz*_*cza 6

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

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

1.文字替换

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

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

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

注意:还有一个Go解析器可以在标准库中实现并且可以在子包中go使用,但是使用text/template包非常简单,看起来就足够了,对于你的情况来说非常好.

2.编译

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