原生http引入模板

结构目录如下:(在根目录下新建statics和templates目录,分别用于放静态文件(CSS和JS)和网页)

1.1 定义一个模板(默认后缀为tmpl,也可以是html):hello.tmpl, 放在templates文件夹下

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Hello</title>
</head>
<body>
    <p>Hello {{.}}</p>
</body>
</html>

1.2 使用GO语言原生包 http 调用并渲染

package main

import (
	"fmt"
	"html/template"
	"net/http"
)

func sayHello(w http.ResponseWriter, r *http.Request) {
	// 解析模板
	t, err := template.ParseFiles("./template/hello.tmpl")
	if err != nil {
		fmt.Println("template.ParseFiles is error: ", err)
		return
	}

	// 渲染模板
	err = t.Execute(w, "golang")
	if err != nil {
		fmt.Println("t.Execute is error: ", err)
		return
	}

}

func main() {
	// http://127.0.0.1:8080/
	http.HandleFunc("/", sayHello)
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println("HTTP server is stop. err: ", err)
		return
	}
}

使用gin来调用和渲染模板

2.1从网上下载一个前段页面,之后将所有静态文件复制到statics目录下,将html文件复制到templates目录下

2.2 使用gin来调用

package main

import (
	"net/http"

	"github.com/gin-gonic/gin"
)

func main() {
	r := gin.Default()

    // 在HTML文件中,修改所有css、js和img资源引用, 加上一个前缀/ydd/, 用于重定向:
	// 加载静态文件(/ydd/css/index_style.css -> /statics/css/index_style.css)
	r.Static("/ydd", "./statics")

	// 解析template目录下所有文件(templates/**/*:表示templates目录下目录的所有文件)
	r.LoadHTMLGlob("templates/*")

	// http://127.0.0.1:8080/index
	r.GET("/index", func(c *gin.Context) {
		c.HTML(http.StatusOK, "index.html", nil)
	})

	r.Run(":8080")
}

template 模板语法扩展

1.1 在HTML中,strut 和 map,都是通过 . 来访问关键字(还有很多,参考:https://www.liwenzhou.com/posts/Go/go_template/)

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Hello</title>
</head>
<body>
    <h2>struct</h2>
    <p>Hello {{.s.Name}}</p>
    <p>Hello {{.s.Age}}</p>

    <h2>map</h2>
    <p>Hello {{.m.name}}</p>
    <p>Hello {{.m.age}}</p>
</body>
</html>

2.0 传递多个数据

package main

import (
	"fmt"
	"html/template"
	"net/http"
)

type User struct {
	Name string
	Age  int
}

func printInfo(w http.ResponseWriter, r *http.Request) {
	// 解析模板
	t, err := template.ParseFiles("./template/hello.tmpl")
	if err != nil {
		fmt.Println("template.ParseFiles is error: ", err)
		return
	}

	// struct
	s := User{
		Name: "张三",
		Age:  15,
	}

	// map
	m := map[string]interface{}{
		"name": "李四",
		"age":  16,
	}

	// 组合数据
	data := map[string]interface{}{
		"s": s,
		"m": m,
	}

	// 渲染模板
	err = t.Execute(w, data)
	if err != nil {
		fmt.Println("t.Execute is error: ", err)
		return
	}

}

func main() {
	// http://127.0.0.1:8080/
	http.HandleFunc("/", printInfo)
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		fmt.Println("HTTP server is stop. err: ", err)
		return
	}
}