2018-05-10 第六周

使用Go寫后端架構(gòu)(一)

首先片酝, go語言的編譯器包含了所有素需要的包欧瘪,因此十分方便寫后臺(tái)眷射,甚至不需要使用框架,就可以輕松搭建。在學(xué)習(xí)Go語言有一個(gè)很好的起點(diǎn)妖碉,Go語言官方文檔很詳細(xì)涌庭,今天我們學(xué)習(xí)的Go Web服務(wù)器的搭建就需要用到Go語言官方提供的標(biāo)準(zhǔn)庫(kù)?net/http,通過http包提供了HTTP客戶端和服務(wù)端的實(shí)現(xiàn)欧宜。同時(shí)使用這個(gè)包能很簡(jiǎn)單地對(duì)web的路由坐榆,靜態(tài)文件,模版冗茸,cookie等數(shù)據(jù)進(jìn)行設(shè)置和操作席镀。如果對(duì)http概念不是太清楚的朋友可以自行google

第一步:導(dǎo)入相關(guān)庫(kù)文件:

import (

"net/http"

"html/template"

? //"encoding/json"

? "fmt"

)

第二步:創(chuàng)建服務(wù)器結(jié)構(gòu)體:與C++類似:

type Serverstruct {

? ? ServerName string

? ? ServerIP? string

}

第三步:綁定端口夏漱,設(shè)置post豪诲,get方法:

func main() {

http.HandleFunc("/", handler)

http.ListenAndServe(":9002", nil)

}

func handler(w http.ResponseWriter, r *http.Request) {

if r.Method =="GET" {

t, err := template.ParseFiles("test.html")

if err != nil {

fmt.Fprintf(w,"parse template error: %s", err.Error())

return

? ? ? }

t.Execute(w, nil)

}else if r.Method =="POST" {

r.ParseForm()

username := r.Form["username"]

password := r.Form["password"]

fmt.Printf("username = %s, password = %s", username, password)

}

}

使用go寫后端最關(guān)鍵的兩個(gè)問題:

如何接收客戶端請(qǐng)求挂绰?

上面代碼執(zhí)行監(jiān)控端口之后,調(diào)用了srv.Serve(net.Listener)函數(shù)扮授,這個(gè)函數(shù)就是處理接收客戶端的請(qǐng)求信 息。這個(gè)函數(shù)里面起了一個(gè)for{}刹勃,首先通過Listener接收請(qǐng)求堪侯,其次創(chuàng)建一個(gè) Conn,最后單獨(dú)開了一個(gè) goroutine荔仁,把這個(gè)請(qǐng)求的數(shù)據(jù)當(dāng)做參數(shù)扔給這個(gè)conn去服務(wù):go c.serve()。這 個(gè)就是高并發(fā)體現(xiàn)了乏梁, 用戶的每一次請(qǐng)求都是在一個(gè)新的goroutine去服務(wù),相互不影響遇骑。

如何分配handler卖毁?

conn首先會(huì)解析request:c.readRequest(),然后獲取相應(yīng)的handler:handler := c.server.Handler,也就是我們剛才在調(diào)用函數(shù)ListenAndServe時(shí)候的第二個(gè)參數(shù)落萎,我們前面例子傳遞的是nil亥啦,也就是為空练链,那么默認(rèn)獲取handler = DefaultServeMux,那么這個(gè)變量用來做什么的呢翔脱?對(duì)媒鼓,這個(gè)變量就是一個(gè)路由器错妖,它用來匹配url跳轉(zhuǎn)到其相應(yīng)的handle函數(shù),那么這個(gè)我們有設(shè)置過嗎?有站玄,我們調(diào)用的代碼里面第一句不是調(diào)用了http.HandleFunc("/", sayhelloName)嘛濒旦。這個(gè)作用就是注冊(cè)了請(qǐng)求/的路由規(guī)則,當(dāng)請(qǐng)求uri為"/"再登,路由就會(huì)轉(zhuǎn)到函數(shù)sayhelloName,DefaultServeMux會(huì)調(diào)用ServeHTTP方法梯嗽,這個(gè)方法內(nèi)部其實(shí)就是調(diào)用sayhelloName本身,最后通過寫入response的信息反饋到客戶端灯节。

代碼如下:

package main

import (

"net/http"

"html/template"

? //"encoding/json"

? "fmt"

)

type Serverstruct {

ServerName string

ServerIP? string

}

func main() {

http.HandleFunc("/", handler)

http.ListenAndServe(":9002", nil)

}

func handler(w http.ResponseWriter, r *http.Request) {

if r.Method =="GET" {

t, err := template.ParseFiles("test.html")

if err != nil {

fmt.Fprintf(w,"parse template error: %s", err.Error())

return

? ? ? }

t.Execute(w, nil)

}else if r.Method =="POST" {

r.ParseForm()

username := r.Form["username"]

password := r.Form["password"]

fmt.Printf("username = %s, password = %s", username, password)

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绵估,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子国裳,更是在濱河造成了極大的恐慌,老刑警劉巖缝左,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渺杉,死亡現(xiàn)場(chǎng)離奇詭異蛇数,居然都是意外死亡是越,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門倚评,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人辑畦,你說我怎么就攤上這事〈砍觯” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵暂筝,是天一觀的道長(zhǎng)箩言。 經(jīng)常有香客問我焕襟,道長(zhǎng)陨收,這世上最難降的妖魔是什么鸵赖? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮饵骨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘茫打。我一直安慰自己,他們只是感情好老赤,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著砖瞧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪块促。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天竭翠,我揣著相機(jī)與錄音,去河邊找鬼斋扰。 笑死啃洋,一個(gè)胖子當(dāng)著我的面吹牛传货,可吹牛的內(nèi)容都是我干的宏娄。 我是一名探鬼主播问裕,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼孵坚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼窥淆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忧饭,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤筷畦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后鳖宾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡攘滩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年漂问,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚤假。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吧兔,死狀恐怖磷仰,靈堂內(nèi)的尸體忽然破棺而出境蔼,到底是詐尸還是另有隱情,我是刑警寧澤箍土,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站瞒爬,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侧但。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一禀横、第九天 我趴在偏房一處隱蔽的房頂上張望粥血。 院中可真熱鬧燕侠,春花似錦、人聲如沸绢彤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至讥耗,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疹启,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工喊崖, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人荤懂。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像晤锥,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矾瘾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理箭启,服務(wù)發(fā)現(xiàn),斷路器册烈,智...
    卡卡羅2017閱讀 134,716評(píng)論 18 139
  • 這周由于五一放假,沒開例會(huì)赏僧。一上午的時(shí)間想用大部分的時(shí)間來學(xué)區(qū)塊鏈,但又想著淀零,會(huì)還是要看的,一方面說問題驾中,一...
    40歲重生閱讀 50評(píng)論 0 0
  • 來簡(jiǎn)書一個(gè)多月了链方,我很多時(shí)候面對(duì)屏幕不知道說些什么灶搜,拿著手機(jī)楞半天。輸出的前提是得吸取割卖,我抽空就看看各大媒...
    莫斯科的犟牛閱讀 604評(píng)論 1 10
  • 首先,在這里向各位道歉鹏溯,由于課程培訓(xùn),今晚沒能參加會(huì)議丙挽,不好意思。以下是我()對(duì)會(huì)議內(nèi)容的幾點(diǎn)小小看法取试。 我認(rèn)為這...
    嬋兮壁玥閱讀 191評(píng)論 0 0
  • 炸雞小姐今天不顧著大北京零下幾度的氣溫蓬坡,自己一個(gè)人去電影院看了這部電影,一開始只是以為又是一個(gè)懷念青春的小成本電...
    吃著炸雞的王小姐閱讀 253評(píng)論 0 2