简单的http server

本文章记录了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")

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容