golang 包含文本_Golang教程之Web篇(七)
首先,大家一起思考一個問題:何為Web編程?
嚴格來說,這只是一個叫法,并沒有學術上的定義,但是一般大家都說到web都是指瀏覽器相關,所以大家一般說的web開發要么是PC Web要么就是手機Web,不過從廣義上講App也算是web編程的一部分。
當今Web編程主要基于Http協議,無論是瀏覽器還是App,很多都說基于Http,但是也有App直接使用TCP通信,比如IM類。但是從Golang的應用場景來說,Go的Web編程一般是指使用Go開發一些基于Http協議的服務,比如網站網頁、App接口。
Go Http編程
如果把范圍縮小到Http就更容易理解了,Http協議幾乎承載了整個互聯網99%的流量,而且Http協議是文本協議,簡單易懂,便于開發調試。
Http協議的交互模型非常簡單: 一個請求對應一個響應。對于編程語言來說,我們只需要解析出Http請求頭,根據協議理解這個請求,然后使用代碼完成請求的操作,最后把結果包裝好,加上一個響應頭,返回回去就行了。
Golang標準庫里面的 net/http 提供了非常強大的封裝,我們只需幾行代碼就可以啟動一個http服務:
package mainimport "net/http"func main() {//使用閉包函數http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) {_, _ = writer.Write([]byte("Hello Worldn"))})//使用自定義函數http.HandleFunc("/say", say)//啟動服務_ = http.ListenAndServe(":8080", nil) }func say(writer http.ResponseWriter, _ *http.Request) {_, _ = writer.Write([]byte("Say Hellon")) }這些看上去非常簡單,但是功能卻很強大,其底層是針對每一個請求都啟動了一個協程去處理,所以并發能力非常強,可以輕松上萬。
這里說個題外話,Go和PHP在Web開上面差異很大,Go可以理解為自帶Web服務器,而PHP往往依賴于apache或nginx,真正處理PHP請求的是fpm服務,而fpm本質上是使用多進程的方式處理請求。一個進程同一時刻只能處理一個請求,PHP請求之間是進程隔離的,但是對于Go來說,各個請求之間是協程隔離的。 舉個例子,在PHP里面,我們可以使用$_GET或$_POST這種超全局變量獲取到當前的請求,但是Go里面不存在。Web框架基本要素
http協議是業界標準,很多語言都可以寫http請求以及http服務,但是無論使用什么語言,編寫http服務的基本套路都差不多,其中有一個套路最出名:MVC。
MVC是最早期的一種Web編程套路,現在很多Web框架依然有MVC的影子,但是功能卻復雜很多,這里我總結了一下最常見的功能:
1.路由
路由類似uri,只不過路由更加靈活,路由的主要作用是把請求轉發給對應的控制器,一般路由都是配合REST API使用。但是Go標準庫的http包路由功能非常簡單,只能是固定字符,并不支持正則或者模糊匹配等高級功能。
不過有一些開源的路由庫,比如 httprouter
2.請求和響應
http協議是文本協議,當我們需要獲取請求頭的一些數據的時候,如果手動去解析未必效率太低,很多web框架都會把這些數據包裝好,一般會有2個對象,request和response,方便用戶操作。
3.數據校驗
出于安全考慮,我們需要對http請求的一些輸入數據做校驗,比如說長度、大小、類型、格式,如果都需要手動去一個個判斷效率太低,這時候就需要一種高效的機制去統一處理。
4.中間件
通常叫作middleware,中間件本質上是一種切片編程的方式,使用中間件可以更方便、簡單的實現一些功能!
實際應用中,我們一般使用中間件來實現用戶權限校驗、日志統計等功能
5.數據庫(ORM)
Web開發過程中少不了對數據的操作,而且很多時候我們都是在做一些圍繞著數據庫的CURD操作。如果細分的話還可以分為關系型數據庫和非關系型數據庫,比如mysql、mongo、elastic search
6.緩存
為了提供服務的性能我們往往需要使用緩存來提供QPS,緩存可以細分為服務器內存緩存、外部緩存(如果redis、memcache)
7.cookies和session
http協議本身是無狀態的,如果需要維護用戶狀態,使用cookies和session這種機制也是一種不錯的選擇!
Go常見Web框架
以上這些點,是一個Web框架需要包含的一些要素,在PHP里面有laravel這樣的大而全的框架,在Java界也有ssh這樣的框架。
然而,在Go界,目前還缺少一個非常完美的框架,很多Go框架比較簡潔,只專注入某些功能,但是好在有不少開源庫,我們可以自己整合一個適合自己開發需求的框架。
大部分時候我建議采用框架開發,主要原因是快,而且方便,框架很多設計思想也值得借鑒,下面我推薦一些Go的知名框架:
一、Beego(https://beego.me/)
這個框架是國人寫的,出來比較早了,目錄結構簡單易懂,功能豐富,開箱即用,據說作者之前一直寫PHP
├── conf │ └── app.conf ├── controllers │ ├── admin │ └── default.go ├── main.go ├── models │ └── models.go ├── static │ ├── css │ ├── ico │ ├── img │ └── js └── views├── admin└── index.tpl這個框架中規中矩,整體是一個非常MVC的架構,基本上功能都有。
二、Gin(https://github.com/gin-gonic/gin)
目前github上面star最多的框架,說是框架,其實缺少很多東西,更像是一個庫,目前只包括了路由、request/response、中間件等功能,雖然缺少數據庫、日志等功能,但是可以自己整合一些開源庫進來。
不過這個框架性能非常高、簡單易用,可以嘗試一下
三、Echo(https://github.com/labstack/echo)
這個也是一個用的人比較多的框架,功能也非常豐富,開箱即用,有很多官方的中間件!
參考資料
Go語言Web編程
總結
以上是生活随笔為你收集整理的golang 包含文本_Golang教程之Web篇(七)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好听的抖音网名129个
- 下一篇: gacutil不是内部或外部命令_Win