go語言模版編程


傳送門: 柏鏈項目學院html



go語言與模版編程

什麼是模版編程

模板是將一個事物的結構規律予以固定化、標準化的成果,它體現的是結構形式的標準化。對於咱們程序員來講,更直白的理解是;對於要輸出的內容,我的位置須要參數化填充,須要填充的參數位置是固定的,輸出的內容是有統一標準的。就像是咱們小時候作的填空題,題目固定,有固定的位置須要填充,模版就是原理。前端

go語言模版編程步驟

go語言開發了專門的packge用於支持模版編程,咱們開發過程當中,有時候會碰到模版編程獲得狀況,好比想要實現自動化的輸出一些用於其餘工程執行的有效代碼,或者造成一些前端頁面,都會用到模版編程。程序員

go語言中模版編程分爲兩個大方向,一種是真的前端的,是在html/template下,還有一個是針對文本的,在text/template下,二者套路相似,咱們來講一下對於文本的處理。golang

模版編程可分爲4步:編程

  • 定義模版
  • 建立模版
  • 模版數據準備
  • 模版執行

咱們能夠先看官方示例給的代碼,把步驟從新認識一遍。數組

type Inventory struct {
    Material string
    Count    uint
}
sweaters := Inventory{"wool", 17}
tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}")
if err != nil { panic(err) }
err = tmpl.Execute(os.Stdout, sweaters)
if err != nil { panic(err) }

所謂的定義模版就是Parse中的內容:數據結構

{{.Count}} items are made of {{.Material}}

template調用New以及後面的Parse就是建立模版:ui

tmpl, err := template.New("test").Parse("{{.Count}} items are made of {{.Material}}")
if err != nil { panic(err) }

模版數據的準備是指結構定義和數據準備:code

type Inventory struct {
    Material string
    Count    uint
}
sweaters := Inventory{"wool", 17}

模版執行是Execute,注意模版執行時須要指定輸出描述符(能夠是某個文件或者標準輸出,對應的go語言中的io.writer)htm

err = tmpl.Execute(os.Stdout, sweaters)

上述例子就是一個最爲簡單的模版編程,更詳盡的能夠看這裏:官方詳細資料

上述例子除了闡述模版編程的四步以外,還有一個重要信息,模版編程在執行的時候,對數據結構體有要求,模版使用{{}}包含的變量名字必須在結構體有其對應,不然執行的時候將不能成功。

下面是模版編程裏的一些actions介紹。

{{/* a comment */}} 註釋
{{pipeline}}   模版的變量
{{if pipeline}} T1 {{end}}   若是pipeline爲空,則T1不會執行,
{{if pipeline}} T1 {{else}} T0 {{end}} 這是在上面的基礎上增長了else分支
{{if pipeline}} T1 {{else if pipeline}} T0 {{end}} 固然還能夠else if,這些對熟悉編程的人來講不算什麼
{{range pipeline}} T1 {{end}}  這個要求pipeline是一個數組,能夠循環輸出T1
{{range pipeline}} T1 {{else}} T0 {{end}} 這個就是pipeline爲空則執行T0
{{with pipeline}} T1 {{end}} with和if相似,若是pipeline存在,則執行T1
{{with pipeline}} T1 {{else}} T0 {{end}} 一樣的else分支處理

咱們來看一些複雜點的例子:

package main

import (
    "fmt"
    "os"
    "text/template"
)

// Define a template.
const letter = `
Dear {{.Name}},
{{if .Attended}}
It was a pleasure to see you at the wedding.{{else}}
It is a shame you couldn't make it to the wedding.{{end}}
{{with .Gift}}Thank you for the lovely {{.}}.
{{end}}
Best wishes,
Josie
`

func main() {

    // Prepare some data to insert into the template.
    type Recipient struct {
        Name, Gift string
        Attended   bool
    }
    var recipients = []Recipient{
        {"Aunt Mildred", "bone china tea set", true},
        {"Uncle John", "moleskin pants", false},
        {"Cousin Rodney", "", false},
    }

    // Create a new template and parse the letter into it.
    t := template.Must(template.New("letter").Parse(letter))

    // Execute the template for each recipient.
    for _, r := range recipients {
        err := t.Execute(os.Stdout, r)
        if err != nil {
            fmt.Println("executing template:", err)
        }
    }
}

上述代碼是一個寫信的模版,收信方是一個固定填充位置,Attended是一個附加信息,若是爲真,則爲受邀參加婚禮,爲假則不被邀請。Gift則是對禮物的描述,若是禮物不爲空,則該收信人會有禮物,不然沒有。

根據數據狀況recipients來看,只有第一我的受邀參加婚禮,前兩我的會有禮物,因此最終的執行結果以下:

Dear Aunt Mildred,

It was a pleasure to see you at the wedding.
Thank you for the lovely bone china tea set.

Best wishes,
Josie

Dear Uncle John,

It is a shame you couldn't make it to the wedding.
Thank you for the lovely moleskin pants.

Best wishes,
Josie

Dear Cousin Rodney,

It is a shame you couldn't make it to the wedding.

Best wishes,
Josie



相關文章
相關標籤/搜索