Go语言搭建网站解析
2016-01-05林路智
摘要:无处不网络,无处不联网是现在社会的一个重要特点,特别是从Web2.0即将步入Web3.0时代加上手机的4G网络,使得网站如雨后春笋一般快速的增加成长,如何才能快速建立一个属于自己的小网站是不少人的热切渴望。Go语言是Google在2009年11月正式推出的新型轻量级系统性程序语言,但在网络后台上却有着独特的优势,借助它的新颖和市场的需求,该文介绍一下用Go语言搭建网站的技术方法。
关键词:Go语言;MVC;Go Web
中图分类号:TP393 文献标识码:A 文章编号:1009-3044(2015)29-0060-02
1 MVC模式
MVC架构模式(Model-View-Controller)是软件工程中的一种比较流行的软件架构模式之一,将整个软件系统分为三个组成部分:Model、View和Controller。MVC模式最早是在1978年由Trygve Reenskaug提出,主要是以实现一种程序设计的动态性,使后续对程序易于修改和扩展简化,并且使程序模型的高内聚低耦合成为可能。
(在下面的程序中 _ 往往表示了error 检测处理,在此暂省)
2 Routing(路由)
路由的指的是把信息通过互联网络从源地址传输到目的地址的活动。路由发生在OSI网络参考模型中的第三层网络层。路由的存在看似自是做了监听端口的功能,但其实还肩负起了解析配置文件,预编译模板,开启文档,启动管理模块等功能。而应对不同的网站的需求,路由设计也会有着很大的区别,可以分为动态路由,静态路由或者可以按方式分为固定路由、正则路由、自由路由。以下只简单的讲一下基础静态路由,主要用到net/http包。
例子(固定路由):
Func main() {
http.Handle("/view/", http.StripPrefix("/view/", http.FileServer(http.Dir("view"))))
//加载view文件进行预编译
http.HandleFunc("/", controllers.Head)
//访问转到controller中的Head程序
err := http.ListenAndServe(":8080", nil) //监听8080端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
} //error诊断记录
}
3 Model(模型)
程序员编写相应的功能程序(如算法实现等)、数据库进行数据库设计和数据管理(当网站足够简单且功能集成时,可以考虑省去Model,直接在controller中实现降低复杂度)。算法类在此暂不讲,下面只以MariaDB(mysql开源分支)为例:
链接管理数据库用到库包”database/sql”,也可以考虑使用第三方包github.com/go-sql-driver/mysql进行管理。
链接数据库代码:
db, _ := sql.Open("mysql", "root:password@/DatabaseaseName")
defer db.Close()
还有的就是利用标准格式加mysql命令进行对数据库管理,如:
err := db.QueryRow("select Age from table where Name = ?", name).Scan(&Age)
//获取table表中name的Age值 (只能运用在确定有此表元素情况下)
使用详情可参考https://golang.org/pkg/database/sql/
4 View(视图)
存放界面设计人员进行的图形界面设计如Html文件,主要是要求对html或xml有一定的基础,亦可称为前端设计。在设置网页时,应该注重高可用即复用性,降低不必要的耦合。这用到了"html/template"包。
加载多个View文件(相应的安全性要比template.New().Parse()降低了很多):
t, _ := template.ParseFiles("view/Global.html", "view/footer.html")
文件输出: t.ExecuteTemplate(w, "filename", message)
注意在组合型网页文件中,要在{{difine "filename"}}......{{end}}内写,在输出文件时填上定义的filename才可正确显示并对其数据填充,填充信息要对应到相应地点的{{.}}中,且参数名首字母要大写。如:
{{define "filename"}}
<
//range 为循环语句, 以end 结束循环
{{range .}}
{{end}}
其中message如果有两个或以上的参数一般以数组结构体的形式进行循环输出
Message := make([]StructName, int)
5 Controller(控制器)
控制器里的程序主要负责转发请求和对请求进行处理。Controller 可以用来根据用户的需求选择连接不同的 Model 和 适当的的View 去完成用户的需求将处理结果显示给用户,也可以构造应用程序,提高了应用程序的灵活性和可配置性。
最基础的控制器如下形式:
func ControllerName(w http.ResponseWriter, r *http.Request) {
//结合Model和View直接写要运行的程序代码
}
复杂点的创建Controller接口interface和相应的结构体Struct,如下:
type ControllerInterfaceName interface {
Get() //method = "GET" 处理
Post() //method = "POST" 处理
Delete() //method = "DELETE" 处理
......
}
6 Cookies Or Sessions(状态)
因为网页是无状态的单次链接请求,所以每次请求是必须添加访问标识符对其进行用户识别。而Cookie和Session的作用就是对用户的登陆状态进行标记每次请求都会添加特有的标识符,但不同的是Cookie主要是针对客户端(浏览器)而Session则是在服务器中进行记录,完善了在没有Cookie的情况下的使用,也更为的安全。
此处只讲一下简单的Cookie使用,而Cookie是直接引用了库中的net/http包,设置参数如下:
type Cookie struct {
Name string
Value string
Path string // optional
Domain string // 域名
Expires time.Time // Cookie存在时间
// MaxAge=0 意为不设Cookie
// MaxAge<0 意为删除当前Cookie 登出时用如:-1
// MaxAge>0 意为添加一个Cookie 登陆时用亦可不用
MaxAge int
} //详情: https://golang.org/pkg/net/http/#Cookie
读取Cookie中的信息可用以下两种方法之一:
1) Username, _ := r.Cookie(“user_name”)
2) for _, cookie := range r.Cookie() {
Username = cookie.Name
} //先定义Username
7 Log and Security(日志和安全性)
直译就是日常行为记录的文件。这对后期恢复和维护至关重要,能避免很多错误的发生和经济的损失。库中有个log包能对系统进行简易的日志处理,可以将error等的相关信息记录下来和个人设定信息输出。
安全性也是任何一个软件系统的重要组成部分,像URL的路由安全检测,数据库中重要信息的加密等。采用普通的加密方法可以参考库中的encoding包或混合hash等包来加大加密的复杂度使之难以破解。
8 结束语
在这大数据时代,数据流的研究已成了各大企业公司的重要发展方向之一,而面对庞大的数据和用户群,不单单是需要对基础知识的理解,更需要对最新前沿的思想和工具保持一定的了解,虽然这只是初用Go语言和开发网站所迈向的第一步,但相信前进的路将是宽阔而没有尽头的。
参考文献:
[1] Ivo Balbaert.The way to Go[M].iUniverse,2012.
[2] 谢孟军.Go Web 编程[M].北京:电子工业出版社,2013.
[3] Beego Framework[EB/OL].http://beego.me/.
[4] wikipedia[EB/OL].https://www.wikipedia.org.
[5] Golang[EB/OL].https://golang.org/.