golang template模板的使用
利用golang的net/http包可以很方便的实现一个web server应用,而配合 html/template 包可以实现类似于python jinja2格式的变量调用。这里就列出两个示例学习html/template模板。
一、利用模板打印当前时间
1、homepage.html模板文件
其内容如下:
<pre data-language="HTML">```markup
# more homepage.html
<html>
<head>
<title>My Page -- www.361way.com</title>
</head>
<body>
<p>The date today is {{.Date}}</p>
<p>And the time is {{.Time}}</p>
</body>
</html>
#### 2、homepage.go运行文件
```go
# more homepage.go
/*
code from www.361way.com <[email protected]>
desc:打印当前时间
*/
package main
import (
"html/template"
"log"
"net/http"
"time"
)
type PageVariables struct {
Date string
Time string
}
func main() {
http.HandleFunc("/", HomePage)
log.Fatal(http.ListenAndServe(":3000", nil))
}
func HomePage(w http.ResponseWriter, r *http.Request){
now := time.Now() // find the time right now
HomePageVars := PageVariables{ //store the date and time in a struct
Date: now.Format("2006-01-02"),
Time: now.Format("15:04:05"),
}
t, err := template.ParseFiles("homepage.html") //parse the html file homepage.html
if err != nil { // if there is an error
log.Print("template parsing error: ", err) // log it
}
err = t.Execute(w, HomePageVars) //execute the template and pass it the HomePageVars struct to fill in the gaps
if err != nil { // if there is an error
log.Print("template executing error: ", err) //log it
}
}
注意,上面时间格式调用的时候有个坑,上面的format必须是2006-01-02 15:04:05这个日期和时间点,这个是不能修改成其他的,这点和其他语言有区别。这个神秘的时间据说是golang在google内部诞生的日子。如果改成其他时间,输出的时间格式会不准确。
注:这个也很好记口诀:12345—1月2号,下午3点04分05秒。
二、选择框
这里第二个示例要做的是做两个选择框,选中什么,页面就交互的反馈给你什么。
1、select.html模板文件
<pre data-language="HTML">```markup
# cat select.html
<html>
<head>
<script type='text/javascript' src='https://ajax.lug.ustc.edu.cn/ajax/libs/jquery/3.1.1/jquery.min.js'></script>
<title>{{.PageTitle}}</title>
</head>
<script type='text/javascript'>
$(document).ready(function() {
$('input[name=animalselect]').change(function(){
$('form').submit();
});
});
</script>
<body>
{{with $1:=.PageRadioButtons}}
<p> Which do you prefer</p>
<form action="/selected" method="post">
{{range $1}}
<input type="radio" name={{.Name}} value={{.Value}} {{if .IsDisabled}} disabled=true {{end}} {{if .IsChecked}}checked{{end}}> {{.Text}}
{{end}}
</form>
{{end}}
{{with $2:=.Answer}}
<p>Your answer is {{$2}}</p>
{{end}}
</body>
</html>
#### 2、select.go文件
其内容如下:
```go
# more select.go
/*
code from www.361way.com <[email protected]>
desc: webserver 选择框
*/
package main
import (
"net/http"
"log"
"html/template"
)
type RadioButton struct {
Name string
Value string
IsDisabled bool
IsChecked bool
Text string
}
type PageVariables struct {
PageTitle string
PageRadioButtons []RadioButton
Answer string
}
func main() {
http.HandleFunc("/", DisplayRadioButtons)
http.HandleFunc("/selected", UserSelected)
log.Fatal(http.ListenAndServe(":3000", nil))
}
func DisplayRadioButtons(w http.ResponseWriter, r *http.Request){
// Display some radio buttons to the user
Title := "Which do you prefer?"
MyRadioButtons := []RadioButton{
RadioButton{"animalselect", "cats", false, false, "Cats"},
RadioButton{"animalselect", "dogs", false, false, "Dogs"},
}
MyPageVariables := PageVariables{
PageTitle: Title,
PageRadioButtons : MyRadioButtons,
}
t, err := template.ParseFiles("select.html") //parse the html file homepage.html
if err != nil { // if there is an error
log.Print("template parsing error: ", err) // log it
}
err = t.Execute(w, MyPageVariables) //execute the template and pass it the HomePageVars struct to fill in the gaps
if err != nil { // if there is an error
log.Print("template executing error: ", err) //log it
}
}
func UserSelected(w http.ResponseWriter, r *http.Request){
r.ParseForm()
// r.Form is now either
// map[animalselect:[cats]] OR
// map[animalselect:[dogs]]
// so get the animal which has been selected
youranimal := r.Form.Get("animalselect")
Title := "Your preferred animal"
MyPageVariables := PageVariables{
PageTitle: Title,
Answer : youranimal,
}
// generate page by passing page variables into template
t, err := template.ParseFiles("select.html") //parse the html file homepage.html
if err != nil { // if there is an error
log.Print("template parsing error: ", err) // log it
}
err = t.Execute(w, MyPageVariables) //execute the template and pass it the HomePageVars struct to fill in the gaps
if err != nil { // if there is an error
log.Print("template executing error: ", err) //log it
}
}