本文章记录了Golang中如何写一个简单的http server,重在分析在Golang中函数是如何作为一等公民被灵活使用的,但是也涉及了很多golang中一些常用的知识点。
本文中涉及的知识点有:
- http server
- 显示类型转换
- 如何实现接口类型
- 定义函数类型变量
- 类型变量之间进行显式转换
首先创建一个handler,具体处理请求的方法
func greeting(w http.ResponeWriter, r *http.Request) {
fmt.Fprintf(w, "Hello Gopher!\n")
}
在main函数中如何调用handler
func main() {
http.ListenAndServe("127.0.0.1:8080", http.HandlerFunc(greeting))
}
至此我们就实现了一个简单的http server。
现在让我们来逐步分析ListenAndServe是如何实现的
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类型实现了Handler接口
type HandlerFunc func(ResponseWriter, Request)
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {
f(w, r)
}
http.Handlerfunc(greeting)是将greeting类型显示转换为HandlerFunc类型,之所以greeting类型能转换成HandlerFunc类型,是因为HandlerFunc的底层类型是func(ResponseWriter, *Request),与greeting类型是一致的例如如下转换:
type Myint int
var x int = 15
y := Myint(x)
再来看一个显示类型转换的例子
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类型转换赋值给BinaryAdder的interface类型,这样通过i调用Add方法实际上就是调用的MyAdd函数。
这种抽象封装方式也叫做适配器(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")
}