1. 程式人生 > 其它 >Go之按照模板實現檔案的建立和更新例項(一般用於自動化程式碼實現)

Go之按照模板實現檔案的建立和更新例項(一般用於自動化程式碼實現)

技術標籤:資料型別go

背景:

近期學習了一下Go-Admin開源專案,裡面的亮點就是可以自動配置化實現資料庫的增刪改查工作,然後自己看了一下原始碼其實實現原理很簡單,就是採用IO流實現檔案的建立和更新工作。裡面主要就是根據模板語言的資料互動,這樣就會實現按照不同的資料生成不同的檔案:

下面以一個很簡單的例項進行解析實現的原理:

步驟:

首先就是要撰寫模板檔案:檔名為 test1.template ,模板語言就是採用{{.}}的形式進行資料的互動,後臺資料要傳輸的型別為map型別。

package test

import (
	"fmt"
	"testing"
)

var Data string
var Package string
func _{{.DataString}}Init() {
Data = strconv.FormatInt({{.DataString}}, 10)
Package = "{{.Package}}"
fmt.Println("當前版本:",Package )
}

func Test111(t *testing.T) {
_{{.DataString}}Init()
fmt.Println("當前時間:", Data)
}

然後就是寫的測試程式碼:實現原理就是在用template包的讀取模板檔案得到模板物件,然後就是建立map物件,裡面傳輸模板檔案中需要的資料,按照上面的情況應該是就是Package和DataString兩個變數。接著就是執行t1.Execute()將map資料傳入到位元組流b1中,最後就是執行檔案建立建立和更新邏輯以及位元組流的輸入。

/**
 * @Author GCG
 * @Description: 功能描述(按照需求生成模板檔案)
 * @Date : 2020/12/7
 */
func Test0(t *testing.T) {
	// template.ParseFiles實現模板檔案的建立
	t1, err := template.ParseFiles("conf/test1.template")
	if err != nil {
		panic(err)
	}
	m := map[string]string{}
	m["Package"] = "test"
	//納秒轉毫秒時間戳
	m["DataString"] = strconv.FormatInt(time.Now().UnixNano()/1e6, 10)
	var b1 bytes.Buffer
	//將上面獲得的模板資料進行相關的資料繫結(即將m中資料輸入到位元組流中)
	err = t1.Execute(&b1, m)
	FileCreate(b1, "./autogeneration_test.go")
}

// 建立檔案並且將模板資料寫入到新檔案中
func FileCreate(content bytes.Buffer, name string) {
	file, err := os.Create(name)
	if err != nil {
		fmt.Println("錯誤異常:", err)
		log.Println(err)
	}
	_, err = file.WriteString(content.String())
	if err != nil {
		log.Println(err)
	}
	file.Close()
}

執行後的效果如下:生成如下的檔案:

具體程式碼如下:

package test

import (
	"fmt"
	"strconv"
	"testing"
)

var Data string
var Package string

func _1607309784637Init() {
	Data = strconv.FormatInt(1607309784637, 10)
	Package = "test"
	fmt.Println("當前版本:", Package)
}

func Test111(t *testing.T) {
	_1607309784637Init()
	fmt.Println("當前時間:", Data)
}

最後測試一下生成的程式碼: (完美的可以使用,)

GOROOT=D:\Go #gosetup
GOPATH=E:\Gopath;E:\Develop\gowork;E:\GITwork\ginWork #gosetup
D:\Go\bin\go.exe test -c -o C:\Users\gree\AppData\Local\Temp\___Test111_in_test_test.exe test/test #gosetup
D:\Go\bin\go.exe tool test2json -t C:\Users\gree\AppData\Local\Temp\___Test111_in_test_test.exe -test.v -test.run ^Test111$ #gosetup
log.level:INFO
=== RUN   Test111
當前版本: test
當前時間: 1607309784637
--- PASS: Test111 (0.00s)
PASS


Process finished with exit code 0

注意事項:

模板語言中{{.DataString}}及時你傳輸的是字串,他會直接將結果輸出到生成檔案中,所以如果要是賦值給一個變數的話需要直接用““號括起來:

例如:

Package = "{{.Package}}"
fmt.Println("當前版本:",Package )

這樣就是可以實現變數的轉換了,否則會報錯,(大家可以嘗試一下,如果有更好的方式可以互相交流)