之前我们简单学习了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}}  

如需下载源码,私信发送,共同谈论学习