Go之按照模板實現檔案的建立和更新例項(一般用於自動化程式碼實現)
阿新 • • 發佈:2020-12-11
背景:
近期學習了一下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 )
這樣就是可以實現變數的轉換了,否則會報錯,(大家可以嘗試一下,如果有更好的方式可以互相交流)