簡(jiǎn)單的http server

本文章記錄了Golang中如何寫一個(gè)簡(jiǎn)單的http server,重在分析在Golang中函數(shù)是如何作為一等公民被靈活使用的,但是也涉及了很多golang中一些常用的知識(shí)點(diǎn)。
本文中涉及的知識(shí)點(diǎn)有:

  • http server
  • 顯示類型轉(zhuǎn)換
  • 如何實(shí)現(xiàn)接口類型
  • 定義函數(shù)類型變量
  • 類型變量之間進(jìn)行顯式轉(zhuǎn)換
    首先創(chuàng)建一個(gè)handler,具體處理請(qǐng)求的方法
func greeting(w http.ResponeWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello Gopher!\n")
}

在main函數(shù)中如何調(diào)用handler

func main() {
    http.ListenAndServe("127.0.0.1:8080", http.HandlerFunc(greeting))
}

至此我們就實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的http server。

現(xiàn)在讓我們來逐步分析ListenAndServe是如何實(shí)現(xiàn)的

func ListenAndServe(addr string, handler Handler) error {
    server := &Server{Addr: addr, Handler: handler}
    return server.ListenAndServe()
}

Handler類型定義是一個(gè)interface

type Handler interface {
    ServeHTTP(ResponceWriter, *Request)
}

HandlerFunc類型實(shí)現(xiàn)了Handler接口

type HandlerFunc func(ResponseWriter, Request)


func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
    f(w, r)
}

http.Handlerfunc(greeting)是將greeting類型顯示轉(zhuǎn)換為HandlerFunc類型,之所以greeting類型能轉(zhuǎn)換成HandlerFunc類型,是因?yàn)镠andlerFunc的底層類型是func(ResponseWriter, *Request),與greeting類型是一致的例如如下轉(zhuǎn)換:

type Myint int
var x int = 15
y := Myint(x)

再來看一個(gè)顯示類型轉(zhuǎn)換的例子

type BinaryAdder interface {
    Add(int, int) int
}

type MyAdderFunc func(int, int) int

func (f MyAdderFunc) Add(x, y int) int {
    return f(x, y)
}

func MyAdd(x, y int) int {
    return x + y
}

func main() {
    var i BinaryAdder = MyAdderFunc(MyAdd)
    fmt.Println(i.Add(5,6))
}

MyAdd通過MyAdderFunc類型轉(zhuǎn)換賦值給BinaryAdder的interface類型,這樣通過i調(diào)用Add方法實(shí)際上就是調(diào)用的MyAdd函數(shù)。
這種抽象封裝方式也叫做適配器(Adapter)模式,下面再舉一個(gè)簡(jiǎn)單的例子:

package main

import "fmt"

type Greeting interface {
    Greeting(s string)
}

type GreetingFunc func(s string)

func (g GreetingFunc) Greeting(s string) {
    g(s)
}

func indianGreeting(s string) {
    fmt.Printf("Hello I'am : %s\n", s)
}

func chineseGreeting(s string) {
    fmt.Printf("Hello I'am: %s\n", s)
}

func main() {
    var g Greeting
    g = GreetingFunc(indianGreeting)
    g.Greeting("Indian")

    g = GreetingFunc(chineseGreeting)
    g.Greeting("Chinese")

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容