使用Golang搭建web服務(wù)的實(shí)現(xiàn)步驟
如何用golang搭建一個(gè)web服務(wù)呢?菜鳥官網(wǎng)的go web編程教程已經(jīng)介紹了web服務(wù)器的工作原理,這里就不贅述了。
我們先看個(gè)例子:http.go
package main import ( "fmt" "io" "log" "net/http" ) func main() { http.HandleFunc("/test", doRequest) // 設(shè)置訪問(wèn)路由 err := http.ListenAndServe(":8000", nil) //設(shè)置監(jiān)聽的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } } func doRequest(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析url傳遞的參數(shù),對(duì)于POST則解析響應(yīng)包的主體(request body) //fmt.Println(r.Form) //這些信息是輸出到服務(wù)器端的打印信息 //fmt.Println("path", r.URL.Path) //fmt.Println("scheme", r.URL.Scheme) //for k, v := range r.Form { // fmt.Println("key:", k) // fmt.Println("value:", strings.Join(v, "")) //} fmt.Fprintf(w, "service start...") //這個(gè)寫入到w的是輸出到客戶端的 也可以用下面的 io.WriteString對(duì)象 //注意:如果沒(méi)有調(diào)用ParseForm方法,下面無(wú)法獲取表單的數(shù)據(jù) //query := r.URL.Query() var uid string // 初始化定義變量 if r.Method == "GET" { uid = r.FormValue("uid") } else if r.Method == "POST" { uid = r.PostFormValue("uid") } io.WriteString(w, "uid = "+uid) }
go run http.go
命令運(yùn)行程序。
之后在瀏覽器中輸入地址:http://127.0.0.1:8000/test?uid=10086
,看下結(jié)果。
在main函數(shù)中,我們從net/http
包中調(diào)用了一個(gè)http.HandleFucn
函數(shù)來(lái)注冊(cè)一個(gè)處理函數(shù)
這個(gè)函數(shù)接受兩個(gè)參數(shù)。第一個(gè)是字符串,這個(gè)就是進(jìn)行路由匹配,我這里是/test路由。第二個(gè)參數(shù)是一個(gè)func (ResponseWriter, Request)
的簽名。
我們的doRequest函數(shù)就是這樣的簽名。下一行中的http.ListenAndServe(":8000", nil)
,表示監(jiān)聽localhost的8000端口,暫時(shí)忽略掉nil。
在doRequest函數(shù)中我們有兩個(gè)參數(shù),一個(gè)是http.ResponseWriter
類型的。它類似響應(yīng)流,實(shí)際上是一個(gè)接口類型。
第二個(gè)是http.Request
類型,類似于HTTP 請(qǐng)求。我們不必使用所有的參數(shù),如果只是簡(jiǎn)單的輸出,那么我們只需要使用http.ResponseWriter,io.WriteString,將會(huì)把輸出流寫入數(shù)據(jù)。
我們?cè)偕晕⒏南?,大家?qǐng)注意修改的部分(這里我們只調(diào)整 main函數(shù)部分代碼)
func main() { mux := http.NewServeMux() mux.HandleFunc("/test", doRequest) err := http.ListenAndServe(":8000", mux) //設(shè)置監(jiān)聽的端口 if err != nil { log.Fatal("ListenAndServe: ", err) } }
這個(gè)例子中,我們不再在函數(shù)http.ListenAndServe
使用nil
了。這個(gè)例子跟上面的例子其實(shí)是一樣的。使用http注冊(cè)hanlder 函數(shù)模式就是用的ServeMux。
我們?cè)僬{(diào)整下看下更復(fù)雜的例子:
package main import ( "fmt" "io" "log" "net/http" ) var mux map[string]func(http.ResponseWriter, *http.Request) func main() { server := http.Server{ Addr: ":8000", Handler: &doHandler{}, } mux = make(map[string]func(http.ResponseWriter, *http.Request)) mux["/test"] = doRequest err := server.ListenAndServe() if err != nil { log.Fatal("ListenAndServe: ", err) } } type doHandler struct{} func (*doHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { if res, ok := mux[r.URL.String()]; ok { res(w, r) return } io.WriteString(w, "url params: "+r.URL.String()) } func doRequest(w http.ResponseWriter, r *http.Request) { r.ParseForm() //解析url傳遞的參數(shù),對(duì)于POST則解析響應(yīng)包的主體(request body) fmt.Fprintf(w, "service start...") //這個(gè)寫入到w的是輸出到客戶端的 也可以用下面的 io.WriteString對(duì)象 }
這個(gè)例子我們沒(méi)有定義ServeMux,而是使用了http.Server。都是用net/http包運(yùn)行了服務(wù)器。
到此這篇關(guān)于使用Golang搭建web服務(wù)的實(shí)現(xiàn)步驟的文章就介紹到這了,更多相關(guān)Golang搭建web服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
CentOS 32 bit安裝golang 1.7的步驟詳解
Go是Google開發(fā)的一種編譯型,并發(fā)型,并具有垃圾回收功能的編程語(yǔ)言。在發(fā)布了6個(gè)rc版本之后,Go 1.7終于正式發(fā)布了。本文主要介紹了在CentOS 32 bit安裝golang 1.7的步驟,文中給出了詳細(xì)的步驟,相信對(duì)大家的學(xué)習(xí)和理解具有一定的參考借鑒價(jià)值,下面來(lái)一起看看吧。2016-12-12Go遍歷struct,map,slice的實(shí)現(xiàn)
本文主要介紹了Go語(yǔ)言遍歷結(jié)構(gòu)體、切片和字典的方法,對(duì)大家的學(xué)習(xí)具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究
這篇文章主要介紹了Golang實(shí)現(xiàn)自己的Redis(TCP篇)實(shí)例探究,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01Go實(shí)現(xiàn)快速生成固定長(zhǎng)度的隨機(jī)字符串
這篇文章主要為大家詳細(xì)介紹了怎樣在Go中簡(jiǎn)單快速地生成固定長(zhǎng)度的隨機(jī)字符串,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以學(xué)習(xí)一下2022-10-10Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP
這篇文章主要為大家介紹了Go?gRPC進(jìn)階教程gRPC轉(zhuǎn)換HTTP教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06Go語(yǔ)言使用Etcd實(shí)現(xiàn)分布式鎖
etcd是近幾年比較火熱的一個(gè)開源的、分布式的鍵值對(duì)數(shù)據(jù)存儲(chǔ)系統(tǒng),本文將介紹如何利用Etcd實(shí)現(xiàn)分布式鎖,感興趣的小伙伴可以跟隨小編一起了解一下2023-05-05Golang實(shí)現(xiàn)四種負(fù)載均衡的算法(隨機(jī),輪詢等)
本文介紹了示例介紹了Golang 負(fù)載均衡的四種實(shí)現(xiàn),主要包括了隨機(jī),輪詢,加權(quán)輪詢負(fù)載,一致性hash,感興趣的小伙伴們可以參考一下2021-06-06