最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go語言HTTPServer開發(fā)的六種方式小結(jié)

 更新時間:2021年11月03日 12:00:07   作者:FunTester  
Golang的Server開發(fā)顯得非常簡單,有很多種方式,本文就介紹了Go語言HTTPServer開發(fā)的六種方式,具有一定的參考價值,感興趣的可以了解一下

學(xué)完了​​net/http​​和​​fasthttp​​兩個HTTP協(xié)議接口的客戶端實(shí)現(xiàn),接下來就要開始Server的開發(fā),不學(xué)不知道一學(xué)嚇一跳,居然這兩個庫還支持Server的開發(fā),太方便了。相比于Java的HTTPServer開發(fā)基本上都是使用Spring或者Springboot框架,總是要配置各種配置類,各種​handle​​對象。Golang的Server開發(fā)顯得非常簡單,就是因?yàn)樘貏e簡單,或者說沒有形成特別統(tǒng)一的規(guī)范或者框架,我發(fā)現(xiàn)了很多實(shí)現(xiàn)方式,HTTP協(xié)議基于還是​​net/http​​和​​fasthttp​​,但是​​handle​​語法就多種多樣了。

先復(fù)習(xí)一下:Golang語言HTTP客戶端實(shí)踐​​、Golang fasthttp實(shí)踐​​。 在Golang語言方面,實(shí)現(xiàn)某個功能的庫可能會比較多,有機(jī)會還是要多跟同行交流,指不定就發(fā)現(xiàn)了更好用的庫。下面我分享我學(xué)到的六種Server開發(fā)的實(shí)現(xiàn)Demo。

第一種

基于​​net/http​​實(shí)現(xiàn),這是一種比較基礎(chǔ)的,對于接口和​​handle​​映射關(guān)系處理并不優(yōu)雅,不推薦使用。

func TestHttpSer(t *testing.T) {
  server := http.Server{
  Addr: ":8001",
  Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    if strings.Index(r.URL.String(), "test") > 0 {
    fmt.Fprintf(w, "這是net/http創(chuàng)建的server第一種方式")
    return
    }
    fmt.Fprintf(w, task.FunTester)
    return
  }),
  }
  server.ListenAndServe()
  log.Println("開始創(chuàng)建HTTP服務(wù)")
}

第二種

第二種也是基于​​net/http​​,這種編寫語法可以很好地解決第一種的問題,handle和path有了類似配置的語法,可讀性提高了很多。

type indexHandler struct {
  content string
}


func (ih *indexHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  fmt.Fprintf(w, ih.content)
}


func TestHttpSer2(t *testing.T) {
  http.Handle("/test", &indexHandler{content: "這是net/http第二種創(chuàng)建服務(wù)語法"})
  http.Handle("/", &indexHandler{content: task.FunTester})
  http.ListenAndServe(":8001", nil)
}

第三種

第三個基于​​net/http​​和​​github.com/labstack/echo​​,后者主要提供了​​Echo​​對象用來處理各類配置包括接口和handle映射,功能很豐富,可讀性最佳。

func TestHttpSer3(t *testing.T) {
  app := echo.New()
  app.Use(middleware.CORSWithConfig(middleware.CORSConfig{
  AllowOrigins: []string{"*"},
  AllowMethods: []string{echo.GET, echo.DELETE, echo.POST, echo.OPTIONS, echo.PUT, echo.HEAD},
  AllowHeaders: []string{echo.HeaderContentType, echo.HeaderAuthorization},
  }))
  app.Group("/test")
  {
  projectGroup := app.Group("/test")
  projectGroup.GET("/", PropertyAddHandler)
  }
  app.Server.Addr = ":8001"
  gracehttp.Serve(app.Server)
}

第四種

第四種依然基于​​net/http​​實(shí)現(xiàn),引入了​​github.com/gin-gonic/gin​​的路由,看起來接口和​​handle​​映射關(guān)系比較明晰了。

func TestHttpServer4(t *testing.T) {
  router := gin.New()

  api := router.Group("/okreplay/api")
  {
  api.POST("/submit", gin.HandlerFunc(func(context *gin.Context) {
    context.ShouldBindJSON(map[string]interface{}{
    "code": 0,
    "msg":  "這是創(chuàng)建HTTPServer第四種方式",
    })
    context.Status(200)
  }))
  }
  s := &http.Server{
  Addr:           ":8001",
  Handler:        router,
  ReadTimeout:    1000 * time.Second,
  WriteTimeout:   1000 * time.Second,
  MaxHeaderBytes: 1 << 20,
  }
  s.ListenAndServe()
}

第五種

第五種基于​​fasthttp​​開發(fā),使用都是​​fasthttp​​提供的API,可讀性尚可,handle配置倒是更像Java了。

func TestFastSer(t *testing.T) {
  address := ":8001"
  handler := func(ctx *fasthttp.RequestCtx) {
  path := string(ctx.Path())
  switch path {
  case "/test":
    ctx.SetBody([]byte("這是fasthttp創(chuàng)建服務(wù)的第一種語法"))
  default:
    ctx.SetBody([]byte(task.FunTester))
  }
  }
  s := &fasthttp.Server{
  Handler: handler,
  Name:    "FunTester server",
  }
  if err := s.ListenAndServe(address); err != nil {
  log.Fatal("error in ListenAndServe", err.Error())
  }
}

第六種

第六種依然基于​​fasthttp​​,用到了​​github.com/buaazp/fasthttprouter​​,有點(diǎn)奇怪兩個居然不在一個GitHub倉庫里。使用語法跟第三種方式有點(diǎn)類似,比較有條理,有利于閱讀。

func TestFastSer2(t *testing.T) {
  address := ":8001"


  router := fasthttprouter.New()
  router.GET("/test", func(ctx *fasthttp.RequestCtx) {
  ctx.Response.SetBody([]byte("這是fasthttp創(chuàng)建server的第二種語法"))
  })
  router.GET("/", func(ctx *fasthttp.RequestCtx) {
  ctx.Response.SetBody([]byte(task.FunTester))
  })
  fasthttp.ListenAndServe(address, router.Handler)
}

到此這篇關(guān)于Go語言HTTPServer開發(fā)的六種實(shí)現(xiàn)小結(jié)的文章就介紹到這了,更多相關(guān)Go HTTPServer 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang操作mongodb的實(shí)現(xiàn)示例

    Golang操作mongodb的實(shí)現(xiàn)示例

    本文主要介紹了Golang操作mongodb的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • Go語言中的閉包詳解

    Go語言中的閉包詳解

    本文詳細(xì)講解了Go語言中的閉包,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • GoLang中的timer定時器實(shí)現(xiàn)原理分析

    GoLang中的timer定時器實(shí)現(xiàn)原理分析

    Timer中對外暴露的只有一個channel,這個 channel也是定時器的核心。當(dāng)計(jì)時結(jié)束時,Timer會發(fā)送值到channel中,外部環(huán)境在這個 channel 收到值的時候,就代表計(jì)時器超時了,可與select搭配執(zhí)行一些超時邏輯
    2023-02-02
  • Go分布式鏈路追蹤實(shí)戰(zhàn)探索

    Go分布式鏈路追蹤實(shí)戰(zhàn)探索

    這篇文章主要為大家介紹了Go分布式鏈路追蹤實(shí)戰(zhàn)示例探索,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • 詳解golang中的method

    詳解golang中的method

    這篇文章主要介紹了golang中的method的相關(guān)資料,幫助大家更好的理解和使用golang,感興趣的朋友可以了解下
    2021-01-01
  • Go語言基礎(chǔ)結(jié)構(gòu)體用法及示例詳解

    Go語言基礎(chǔ)結(jié)構(gòu)體用法及示例詳解

    這篇文章主要為大家介紹了Go語言基礎(chǔ)結(jié)構(gòu)體的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • 使用Go中的Web3庫進(jìn)行區(qū)塊鏈開發(fā)的案例

    使用Go中的Web3庫進(jìn)行區(qū)塊鏈開發(fā)的案例

    區(qū)塊鏈作為一種分布式賬本技術(shù),在近年來取得了巨大的發(fā)展,而Golang作為一種高效、并發(fā)性強(qiáng)的編程語言,被廣泛用于區(qū)塊鏈開發(fā)中,本文將介紹如何使用Golang中的Web3庫進(jìn)行區(qū)塊鏈開發(fā),并提供一些實(shí)際案例,需要的朋友可以參考下
    2023-10-10
  • Go cobra庫使用教程

    Go cobra庫使用教程

    cobra既是一個用于創(chuàng)建強(qiáng)大現(xiàn)代CLI應(yīng)用程序的庫,也是一個生成應(yīng)用程序和命令文件的程序。cobra被用在很多go語言的項(xiàng)目中,比如 Kubernetes、Docker、Istio、ETCD、Hugo、Github CLI等等
    2022-12-12
  • 對Golang import 導(dǎo)入包語法詳解

    對Golang import 導(dǎo)入包語法詳解

    今天小編就為大家分享一篇對Golang import 導(dǎo)入包語法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • golang切片原理詳細(xì)解析

    golang切片原理詳細(xì)解析

    這篇文章主要介紹了golang切片原理詳細(xì)解析,切片在編譯時定義為Slice結(jié)構(gòu)體,并通過NewSlice()函數(shù)進(jìn)行創(chuàng)建,更多相關(guān)內(nèi)容感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-06-06

最新評論

龙海市| 龙州县| 克拉玛依市| 临洮县| 通州区| 英德市| 崇仁县| 玛纳斯县| 黔江区| 白银市| 包头市| 宝应县| 永清县| 原平市| 枣庄市| 荣昌县| 玉林市| 潜山县| 白河县| 孝义市| 徐水县| 临漳县| 呼伦贝尔市| 安多县| 和田县| 巴塘县| 钦州市| 高安市| 阿拉善左旗| 慈溪市| 石家庄市| 苗栗市| 静乐县| 益阳市| 贵溪市| 通河县| 新龙县| 勃利县| 大渡口区| 蓬莱市| 宁强县|