摘要:無處不網(wǎng)絡(luò),無處不聯(lián)網(wǎng)是現(xiàn)在社會的一個(gè)重要特點(diǎn),特別是從Web2.0即將步入Web3.0時(shí)代加上手機(jī)的4G網(wǎng)絡(luò),使得網(wǎng)站如雨后春筍一般快速的增加成長,如何才能快速建立一個(gè)屬于自己的小網(wǎng)站是不少人的熱切渴望。Go語言是Google在2009年11月正式推出的新型輕量級系統(tǒng)性程序語言,但在網(wǎng)絡(luò)后臺上卻有著獨(dú)特的優(yōu)勢,借助它的新穎和市場的需求,該文介紹一下用Go語言搭建網(wǎng)站的技術(shù)方法。
關(guān)鍵詞:Go語言;MVC;Go Web
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2015)29-0060-02
1 MVC模式
MVC架構(gòu)模式(Model-View-Controller)是軟件工程中的一種比較流行的軟件架構(gòu)模式之一,將整個(gè)軟件系統(tǒng)分為三個(gè)組成部分:Model、View和Controller。MVC模式最早是在1978年由Trygve Reenskaug提出,主要是以實(shí)現(xiàn)一種程序設(shè)計(jì)的動態(tài)性,使后續(xù)對程序易于修改和擴(kuò)展簡化,并且使程序模型的高內(nèi)聚低耦合成為可能。
(在下面的程序中 _ 往往表示了error 檢測處理,在此暫?。?/p>
2 Routing(路由)
路由的指的是把信息通過互聯(lián)網(wǎng)絡(luò)從源地址傳輸?shù)侥康牡刂返幕顒?。路由發(fā)生在OSI網(wǎng)絡(luò)參考模型中的第三層網(wǎng)絡(luò)層。路由的存在看似自是做了監(jiān)聽端口的功能,但其實(shí)還肩負(fù)起了解析配置文件,預(yù)編譯模板,開啟文檔,啟動管理模塊等功能。而應(yīng)對不同的網(wǎng)站的需求,路由設(shè)計(jì)也會有著很大的區(qū)別,可以分為動態(tài)路由,靜態(tài)路由或者可以按方式分為固定路由、正則路由、自由路由。以下只簡單的講一下基礎(chǔ)靜態(tài)路由,主要用到net/http包。
例子(固定路由):
Func main() {
http.Handle("/view/", http.StripPrefix("/view/", http.FileServer(http.Dir("view"))))
//加載view文件進(jìn)行預(yù)編譯
http.HandleFunc("/", controllers.Head)
//訪問轉(zhuǎn)到controller中的Head程序
err := http.ListenAndServe(":8080", nil) //監(jiān)聽8080端口
if err != nil {
log.Fatal("ListenAndServe: ", err)
} //error診斷記錄
}
3 Model(模型)
程序員編寫相應(yīng)的功能程序(如算法實(shí)現(xiàn)等)、數(shù)據(jù)庫進(jìn)行數(shù)據(jù)庫設(shè)計(jì)和數(shù)據(jù)管理(當(dāng)網(wǎng)站足夠簡單且功能集成時(shí),可以考慮省去Model,直接在controller中實(shí)現(xiàn)降低復(fù)雜度)。算法類在此暫不講,下面只以MariaDB(mysql開源分支)為例:
鏈接管理數(shù)據(jù)庫用到庫包”database/sql”,也可以考慮使用第三方包github.com/go-sql-driver/mysql進(jìn)行管理。
鏈接數(shù)據(jù)庫代碼:
db, _ := sql.Open("mysql", "root:password@/DatabaseaseName")
defer db.Close()
還有的就是利用標(biāo)準(zhǔn)格式加mysql命令進(jìn)行對數(shù)據(jù)庫管理,如:
err := db.QueryRow("select Age from table where Name = ?", name).Scan(&Age)
//獲取table表中name的Age值 (只能運(yùn)用在確定有此表元素情況下)
使用詳情可參考https://golang.org/pkg/database/sql/
4 View(視圖)
存放界面設(shè)計(jì)人員進(jìn)行的圖形界面設(shè)計(jì)如Html文件,主要是要求對html或xml有一定的基礎(chǔ),亦可稱為前端設(shè)計(jì)。在設(shè)置網(wǎng)頁時(shí),應(yīng)該注重高可用即復(fù)用性,降低不必要的耦合。這用到了"html/template"包。
加載多個(gè)View文件(相應(yīng)的安全性要比template.New().Parse()降低了很多):
t, _ := template.ParseFiles("view/Global.html", "view/footer.html")
文件輸出: t.ExecuteTemplate(w, "filename", message)
注意在組合型網(wǎng)頁文件中,要在{{difine "filename"}}......{{end}}內(nèi)寫,在輸出文件時(shí)填上定義的filename才可正確顯示并對其數(shù)據(jù)填充,填充信息要對應(yīng)到相應(yīng)地點(diǎn)的{{.}}中,且參數(shù)名首字母要大寫。如:
{{define "filename"}}
<
//range 為循環(huán)語句, 以end 結(jié)束循環(huán)
{{range .}}
{{end}}
其中message如果有兩個(gè)或以上的參數(shù)一般以數(shù)組結(jié)構(gòu)體的形式進(jìn)行循環(huán)輸出
Message := make([]StructName, int)
5 Controller(控制器)
控制器里的程序主要負(fù)責(zé)轉(zhuǎn)發(fā)請求和對請求進(jìn)行處理。Controller 可以用來根據(jù)用戶的需求選擇連接不同的 Model 和 適當(dāng)?shù)牡腣iew 去完成用戶的需求將處理結(jié)果顯示給用戶,也可以構(gòu)造應(yīng)用程序,提高了應(yīng)用程序的靈活性和可配置性。
最基礎(chǔ)的控制器如下形式:
func ControllerName(w http.ResponseWriter, r *http.Request) {
//結(jié)合Model和View直接寫要運(yùn)行的程序代碼
}
復(fù)雜點(diǎn)的創(chuàng)建Controller接口interface和相應(yīng)的結(jié)構(gòu)體Struct,如下:
type ControllerInterfaceName interface {
Get() //method = "GET" 處理
Post() //method = "POST" 處理
Delete() //method = "DELETE" 處理
......
}
6 Cookies Or Sessions(狀態(tài))
因?yàn)榫W(wǎng)頁是無狀態(tài)的單次鏈接請求,所以每次請求是必須添加訪問標(biāo)識符對其進(jìn)行用戶識別。而Cookie和Session的作用就是對用戶的登陸狀態(tài)進(jìn)行標(biāo)記每次請求都會添加特有的標(biāo)識符,但不同的是Cookie主要是針對客戶端(瀏覽器)而Session則是在服務(wù)器中進(jìn)行記錄,完善了在沒有Cookie的情況下的使用,也更為的安全。
此處只講一下簡單的Cookie使用,而Cookie是直接引用了庫中的net/http包,設(shè)置參數(shù)如下:
type Cookie struct {
Name string
Value string
Path string // optional
Domain string // 域名
Expires time.Time // Cookie存在時(shí)間
// MaxAge=0 意為不設(shè)Cookie
// MaxAge<0 意為刪除當(dāng)前Cookie 登出時(shí)用如:-1
// MaxAge>0 意為添加一個(gè)Cookie 登陸時(shí)用亦可不用
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(日志和安全性)
直譯就是日常行為記錄的文件。這對后期恢復(fù)和維護(hù)至關(guān)重要,能避免很多錯(cuò)誤的發(fā)生和經(jīng)濟(jì)的損失。庫中有個(gè)log包能對系統(tǒng)進(jìn)行簡易的日志處理,可以將error等的相關(guān)信息記錄下來和個(gè)人設(shè)定信息輸出。
安全性也是任何一個(gè)軟件系統(tǒng)的重要組成部分,像URL的路由安全檢測,數(shù)據(jù)庫中重要信息的加密等。采用普通的加密方法可以參考庫中的encoding包或混合hash等包來加大加密的復(fù)雜度使之難以破解。
8 結(jié)束語
在這大數(shù)據(jù)時(shí)代,數(shù)據(jù)流的研究已成了各大企業(yè)公司的重要發(fā)展方向之一,而面對龐大的數(shù)據(jù)和用戶群,不單單是需要對基礎(chǔ)知識的理解,更需要對最新前沿的思想和工具保持一定的了解,雖然這只是初用Go語言和開發(fā)網(wǎng)站所邁向的第一步,但相信前進(jìn)的路將是寬闊而沒有盡頭的。
參考文獻(xiàn):
[1] Ivo Balbaert.The way to Go[M].iUniverse,2012.
[2] 謝孟軍.Go Web 編程[M].北京:電子工業(yè)出版社,2013.
[3] Beego Framework[EB/OL].http://beego.me/.
[4] wikipedia[EB/OL].https://www.wikipedia.org.
[5] Golang[EB/OL].https://golang.org/.