Go語言實(shí)現(xiàn)一個(gè)Http Server框架(二) Server的抽象
上一篇文章對http庫的基本使用做了說明,下面來實(shí)現(xiàn)一個(gè)簡單地httpServer
package main import ( "fmt" "log" "net/http" ) func home(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "這是主頁") } func user(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "這是用戶頁面") } func main() { http.HandleFunc("/", home) http.HandleFunc("/user", user) log.Fatal(http.ListenAndServe(":8080", nil)) }
此時(shí)啟動(dòng)服務(wù)并訪問8080端口,可以看到下面的頁面
但是如果我想同時(shí)啟動(dòng)多個(gè)server監(jiān)聽不同的端口該怎么辦? 我們可以從邏輯上抽象出一個(gè)Server,可以表示對某個(gè)端口進(jìn)行監(jiān)聽的實(shí)體,這樣必要的時(shí)候,我們就可以啟動(dòng)多個(gè)Server來監(jiān)聽不同的端口
首先我們來寫一個(gè)接口
type Server interface{ //Route 設(shè)定一個(gè)路由,命中路由會(huì)執(zhí)行handlerFunc的代碼 Route(pattern string handlerFunc http.HandlerFunc) //Start 用于啟動(dòng)服務(wù) Start(address string) error }
實(shí)現(xiàn)Server接口
func (s *sdkHttpServer) Route(pattern string,handlerFunc http.HandlerFunc){ http.HandleFunc(pattern,handlerFunc) } func (s *sdkHttpServer) Start(address string) error{ http.ListenAndServer(address,nil) } func NewSdkHttpServer(name string) Server { return &sdkHttpServer{ Name:name, } }
現(xiàn)在我們已經(jīng)可以同時(shí)監(jiān)聽多個(gè)端口了
func main(){ server := web.NewSdkHttpServer("my-test-server") server.Route("/",home) server.Route("/user",user) server.Start("8080") }
雖然我們已經(jīng)對Server進(jìn)行了抽象,但是在請求處理的過程中仍然存在問題,就比如我們要實(shí)現(xiàn)一個(gè)用戶注冊的接口
所以我們需要繼續(xù)對Context也就是上下文做一下抽象,這里的Context是我們自定義的Context不是go原生的Context
到此這篇關(guān)于Go語言實(shí)現(xiàn)一個(gè)Http Server框架(二) Server的抽象的文章就介紹到這了,更多相關(guān)Go語言Http Server框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
go語言限制協(xié)程并發(fā)數(shù)的方案詳情
一個(gè)線程中可以有任意多個(gè)協(xié)程,但某一時(shí)刻只能有一個(gè)協(xié)程在運(yùn)行,多個(gè)協(xié)程分享該線程分配到的計(jì)算機(jī)資源,接下來通過本文給大家介紹go語言限制協(xié)程的并發(fā)數(shù)的方案詳情,感興趣的朋友一起看看吧2022-01-01談?wù)揋o 什么時(shí)候會(huì)觸發(fā) GC問題
Go 語言作為一門新語言,在早期經(jīng)常遭到唾棄的就是在垃圾回收(下稱:GC)機(jī)制中 STW(Stop-The-World)的時(shí)間過長。下面文章就對此話題展開,感興趣的小伙伴可以參考下面文章的內(nèi)容2021-09-09go語言處理TCP拆包/粘包的具體實(shí)現(xiàn)
TCP的拆包/粘包也算是網(wǎng)絡(luò)編程中一個(gè)比較基礎(chǔ)的問題了,本文主要介紹了go語言處理TCP拆包/粘包,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片
這篇文章主要為大家詳細(xì)介紹了golang使用泛型結(jié)構(gòu)體實(shí)現(xiàn)封裝切片,即封裝切片的增、刪、改、查、長度大小、ForEach(遍歷切片),感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn)
這篇文章主要介紹了Golang在Mac、Linux、Windows下如何交叉編譯的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03在golang中使用Sync.WaitGroup解決等待的問題
這篇文章主要介紹了在golang中使用Sync.WaitGroup解決等待的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-04-04