之前我们简单学习了golang web编程的单一功能,我们今天先简单了解一下MVC结构下的编程方法。
目录结构树
D:\go\src\go7\demo3>tree /F
文件夹 PATH 列表
卷序列号为 42BA-8F20
D:.
│ main.go //主入口程序
│ main_test.go //单元测试程序
│
├─controller //控制器文件夹,主要放控制器程序
│ │ main.go //控制器主程序,主要注册路由和一些公共函数和方法
│ │
│ ├─home //控制器的分级目录,主要放分级的控制器
│ │ index.go //控制器的分级目录下的功能实现
│ │
│ └─index //控制器的分级目录,主要放分级的控制器
│ index.go //控制器的分级目录下的功能实现
│
├─model //
└─view //视图文件夹,主要放置模板文件
├─base //视图文件夹分级文件夹,主要放置被继承的模板文件和公共文件
│ base.html//视图文件夹分级文件夹下的被继承的模板文件和公共文件
│
├─home //视图文件夹分级文件夹,主要放置继承的模板文件和视图文件
│ index.html//视图文件夹分级文件夹下的被继承的模板文件和视图文件
│
└─index //视图文件夹分级文件夹,主要放置继承的模板文件和视图文件
index.html//视图文件夹分级文件夹下的被继承的模板文件和视图文件
主入口程序
D:\go\src\go7\demo3\main.go
package main
import (
"go7/demo3/controller"
"log"
"net/http"
)
func main() {
//设置日志显示内容
log.SetFlags(log.Lshortfile | log.LstdFlags)
//注册控制器
controller.Register()
//启动服务器
_ = http.ListenAndServe(":80", nil)
}
单元测试程序
D:\go\src\go7\demo3\main_test.go
package main
import (
"go7/demo3/controller/home"
"go7/demo3/controller/index"
"io/ioutil"
"net/http"
"net/http/httptest"
"testing"
)
func TestIndex(t *testing.T) {
handler := http.HandlerFunc(index.Index)
app := httptest.NewServer(handler)
defer app.Close()
_url := app.URL + "/" + "index"
t.Log(_url)
response, _ := http.Get(_url)
defer response.Body.Close()
bytes, _ := ioutil.ReadAll(response.Body)
t.Log(string(bytes))
}
func TestHome(t *testing.T) {
handler := http.HandlerFunc(home.Index)
app := httptest.NewServer(handler)
defer app.Close()
_url := app.URL + "/" + "home"
t.Log(_url)
response, _ := http.Get(_url)
defer response.Body.Close()
bytes, _ := ioutil.ReadAll(response.Body)
t.Log(string(bytes))
}
控制器源码
D:\go\src\go7\demo3\controller\main.go
package controller
import (
"go7/demo3/controller/home"
"go7/demo3/controller/index"
"net/http"
)
func Register() {
//注册HandleFunc
http.HandleFunc("/index", index.Index)
http.HandleFunc("/home", home.Index)
}
D:\go\src\go7\demo3\controller\home\index.go
package home
import (
"log"
"net/http"
"text/template"
)
func Index(w http.ResponseWriter, r *http.Request) {
//解析模板文件
parseFiles, err := template.ParseFiles(
"view/home/index.html",
"view/base/base.html",
)
if err != nil {
log.Println(err.Error())
}
//渲染模板文件
err = parseFiles.ExecuteTemplate(w, "home_index", map[string]interface{}{
"user": map[string]interface{}{
"name": "李四",
"age": 28,
"address": "上海市",
},
"title": "demo3/controller/home/index.go",
})
if err != nil {
log.Println(err.Error())
}
}
D:\go\src\go7\demo3\controller\index\index.go
package index
import (
"log"
"net/http"
"text/template"
)
func Index(w http.ResponseWriter, r *http.Request) {
//解析模板文件
parseFiles, err := template.ParseFiles(
"view/index/index.html",
"view/base/base.html",
)
if err != nil {
log.Println(err.Error())
}
//渲染模板文件
err = parseFiles.ExecuteTemplate(w, "index_index", map[string]interface{}{
"user": map[string]interface{}{
"name": "张三",
"age": 18,
"address": "北京市",
},
"title": "demo3/controller/index/index.go",
})
if err != nil {
log.Println(err.Error())
}
}
视图源码
D:\go\src\go7\demo3\view\base\base.html
{{define "base_base"}}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{{block "title" .}}{{end}}</title>
</head>
<body>
{{block "body" .}}
{{end}}
</body>
</html>
{{end}}
D:\go\src\go7\demo3\view\home\index.html
{{define "home_index"}}
{{template "base_base" .}}
{{end}}
{{define "title"}}
{{.title}}
{{end}}
{{define "body"}}
<pre>
{{.user.name}}今年{{.user.age}}岁,居住在{{.user.address}}
</pre>
{{end}}
D:\go\src\go7\demo3\view\index\index.html
{{define "index_index"}}
{{template "base_base" .}}
{{end}}
{{define "title"}}
{{.title}}
{{end}}
{{define "body"}}
<pre>
{{.user.name}}今年{{.user.age}}岁,居住在{{.user.address}}
</pre>
{{end}}
如需下载源码,私信发送,共同谈论学习