本文章記錄了Golang中如何寫一個簡單的http server迹蛤,重在分析在Golang中函數(shù)是如何作為一等公民被靈活使用的氨鹏,但是也涉及了很多golang中一些常用的知識點争拐。
本文中涉及的知識點有:
- http server
- 顯示類型轉(zhuǎn)換
- 如何實現(xiàn)接口類型
- 定義函數(shù)類型變量
- 類型變量之間進行顯式轉(zhuǎn)換
首先創(chuàng)建一個handler粮坞,具體處理請求的方法
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))
}
至此我們就實現(xiàn)了一個簡單的http server。
現(xiàn)在讓我們來逐步分析ListenAndServe是如何實現(xiàn)的
func ListenAndServe(addr string, handler Handler) error {
server := &Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
Handler類型定義是一個interface
type Handler interface {
ServeHTTP(ResponceWriter, *Request)
}
HandlerFunc類型實現(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類型秫筏,是因為HandlerFunc的底層類型是func(ResponseWriter, *Request),與greeting類型是一致的例如如下轉(zhuǎn)換:
type Myint int
var x int = 15
y := Myint(x)
再來看一個顯示類型轉(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方法實際上就是調(diào)用的MyAdd函數(shù)这敬。
這種抽象封裝方式也叫做適配器(Adapter)模式,下面再舉一個簡單的例子:
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")
}