前言
Go-Template模板讲解了模板,但是模板本身是静态文件。而在go中,默认情况下,将项目打包成可执行文件时,是不会把依赖的静态资源文件也打包的,所以在部署的时除了要把可执行文件复制到指定目录,还需要把需要的静态文件放到指定位置,这就显得比较繁琐。
而静态文件具有不变性,所以如果能在打包时,把静态资源一并打包,就可以减少部署成本。而go-bindata就可以把静态文件转换为go源文件,就可以实现这个事情。
使用 go-bindata
首先使用下面命令安装
go get -u github.com/jteeuwen/go-bindata/...
安装完毕后,使用下面命令,把我们的a.tpl文件转换为tpl.go文件:
go-bindata -pkg main -o tpl.go a.tpl
使用上面命令我们可以吧a.tpl文件转换为tpl.go文件。其中-o是指定生成的文件的名称为tpl.go,-pkg是指定生成的tpl.go文件的包名为main,a.tpl是目标tpl。
比如a.tpl内容为:
/**创建变量company,保存Company变量**/
{
{ $company := .Company}}
/**遍历Company内的所有Person**/
{
{ range .Company.Persons -}}
/** 如果名称为"jiaduo" 则先打印person的name,然后打印公司名**/
{
{- if eq .Name "JiaDuo" }}
{
{ lowerFirst .Name}} {
{$.Company.CompanyName}}
{
{- else }}
/** 否则先打印公司名称,然后打印Person的name**/
{
{$company.CompanyName}} {
{ lowerFirst .Name}}
{
{- end }}
{
{ end -}}
则生成的tpl.go内容为:
// Code generated by go-bindata. (@generated) DO NOT EDIT.
// Package tpl generated by go-bindata.
// sources:
// a.tpl
package main
import (
"bytes"
"compress/gzip"
"fmt"
"io"
"io/ioutil"
"os"
"path/filepath"
"strings"
"time"
)
func bindataRead(data []byte, name string) ([]byte, error) {
gz, err := gzip.NewReader(bytes.NewBuffer(data))
if err != nil {
return nil, fmt.Errorf("read %q: %v", name, err)
}
var buf bytes.Buffer
_, err = io.Copy(&buf, gz)
clErr := gz.Close()
if err != nil {
return nil, fmt.E