golang-mako 模版引擎二进制制作
一、效果:
go语言通过exec传入模版和变量,去调用制作好的python二进制,并接收渲染结果。
❯ go run test.go 15:23:39 WiFi 400 Mbps
go: {"ErrCode": 0, "ErrMsg": "OK", "Data": "hello, lgh! success!"}
二、代码:
1. python二进制:
from mako.template import Template
import sys
import json
class SetStdout:
ErrCode = 20
ErrMsg = 'OK'
Data = ''
def __init__(self, errCode, errMsg, data):
self.ErrCode = errCode
self.ErrMsg = errMsg
self.Data = data
def getJsonFormat(self):
js = json.dumps(self.__dict__)
return js
inputData = json.loads(sys.stdin.readline())
tpDate = inputData['Template']
varsData = inputData['vars']
t = Template(tpDate)
renderdTp = t.render(**varsData)
print(SetStdout(0, 'OK', renderdTp).getJsonFormat())
2. go代码:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"os/exec"
)
func main() {
m := make(map[string]interface{}, 0)
m["Template"] = "hello, ${name}! ${test}!"
m["vars"] = map[string]string{
"name":"lgh",
"test":"success",
}
stdin, _ := json.Marshal(m)
stdout := &bytes.Buffer{}
var stderr io.Writer
c := exec.Command("../test")
c.Stdin = bytes.NewBuffer(stdin)
c.Stdout = stdout
c.Stderr = stderr
if err := c.Run(); err != nil {
fmt.Printf("execute command failed, err %s", err.Error())
}
outputBytes := stdout.Bytes()
fmt.Printf("go: %s", string(outputBytes))
}