前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用golang写一个基本的服务器

使用golang写一个基本的服务器

作者头像
大话swift
发布2019-08-01 11:26:56
1.2K0
发布2019-08-01 11:26:56
举报
文章被收录于专栏:大话swift大话swift

go自带基本的http系统,开源的go web服务相关的框架大多是基于此进行的扩展延伸,比如以快速小巧著称的gin,国人写的beego等,以及爬虫框架colly都是基于此。我们今天聊聊这个http库怎么简单的写一个http服务。

我们今天只是简答的实现一个server并不会去添加路由session cookie等的控制……

go启动一个server服务异常的简单,短短数行代码即可

代码语言:javascript
复制
func ListenAndServe(addr string, handler Handler) error {
  server := &Server{Addr: addr, Handler: handler}
  return server.ListenAndServe()
}

上问是官方的定义,我们可以直接拿来用

代码语言:javascript
复制
  http.ListenAndServe(":8081", nil)

一句话启动起来一个服务,由于我们没有添加Handler所以是无法响应服务的,我们接下来添加一个handler,在此之前我们看看所谓的Handler是个什么东东?

代码语言:javascript
复制
type Handler interface {
  ServeHTTP(ResponseWriter, *Request)
}

从定义来看,Handler是个接口,因此我们可以定义一个实体struct或者一个函数均可以用于响应数据

代码语言:javascript
复制
func hello(w http.ResponseWriter, req *http.Request) {
  headers := ""

  for key := range req.Header {
    headers += key + "=>" + req.Header.Get(key)+"<br>"

    w.Header().Add(key, req.Header.Get(key))
  }
  content:=`<html><body>`+"Hello World<br>"+ headers+`</body></html>`
  w.Write([]byte(content))
  w.WriteHeader(200)

}

然后我们看看网络发起请求之中都包含什么

req已经为我们封装好了,必要的数据,我们可以从中获取到用户发送的数据请求,然后进行处理。对于有路由层的框架就可以根据此机型路由映射控制,内部进行数据分发。看看我们的gin是如何走的

代码语言:javascript
复制
// ServeHTTP conforms to the http.Handler interface.
func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) {
  c := engine.pool.Get().(*Context)
  c.writermem.reset(w)
  c.Request = req
  c.reset()

  engine.handleHTTPRequest(c)

  engine.pool.Put(c)
}

我们看到gin将用户的req保存在context中,然后engine来根据请求进行处理,而图中的t:=engin.trees就是route路由组成的二叉树然后进行最大匹配,最后将请求数据分发给对应的响应Handler(当然了,route不是我们的讲解范围啦)

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档