【问题标题】:Dynamically create compiled binary with go使用 go 动态创建编译后的二进制文件
【发布时间】:2015-05-15 11:54:26
【问题描述】:

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

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

谢谢。

【问题讨论】:

  • 这是使用go-bindata 可以解决的问题吗?

标签: dynamic go compilation dynamically-generated


【解决方案1】:

所以你有 2 个子任务一起做你想做的事:

  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() 来执行它。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-04
  • 2020-05-03
  • 1970-01-01
  • 1970-01-01
  • 2017-04-11
相关资源
最近更新 更多