关闭

Go http源码解析(一)

标签: Golang源码Go-httpgo-web源码解析
1213人阅读 评论(0) 收藏 举报
分类:

Go web之旅

此篇开始将开启Go web之旅,我将这趟旅途分为三个子旅程:

  1. 源码解析
  2. 框架解读
  3. 中间件使用

所以在这趟旅途中我们将领略源码之雄伟,框架之奇艳,中间件之灵秀。在接下来的时间里我会按照上面的目录依次讲解。
现在开始踏上Go web的旅程。

func firstHandler(w http.ResponseWriter, r *http.Request) {
     io.WriteString(w, "Hello,world")
}
func main() {
        http.HandleFunc("/hello", firstHandler)
    http.ListenAndServe(":8080", nil)
}

在main函数中,http.HandleFunc设置所有对路径为/hello请求的处理函数为firstHandler.
接下来调用http.ListenAndServe,在8080端口开始监听将阻塞,直到退出。

我们将以源码解析作为整个旅程的开篇。
Go语言作为互联网中的c语言,他让web开发简洁到不能再简洁了。首先我们来介绍他让web开发变得简易所涉及的最重要的包(package)(当遇到包时一般直接用package表示)之一http.

package http在service.go中。
// HTTP server.  See RFC 2616.
package http
//声明一个Handler接口,若某函数实现了ServeHTTP函数就实现了该接口
type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

那我们该如何实现该接口呢?
其实在service.go中他已经默认实现了该函数

type ServeMux struct {//定义路由规则
     mu    sync.RWMutex//锁机制,因为并发处理需要一个锁
     m     map[string]muxEntry//路由,采用map结构
    hosts bool // whether any patterns contain hostnames
}
type muxEntry struct {//路由
     explicit bool   //是否精准匹配
     h        Handler//路由匹配后,所选择的处理
    pattern  string //匹配字符串
}

// ServeHTTP dispatches the request to the handler whose
// pattern most closely matches the request URL.
//路由结构ServeMux实现ServeHTTP函数
func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {
     if r.RequestURI == "*" {
     if r.ProtoAtLeast(1, 1) {
    w.Header().Set("Connection", "close")
}
     w.WriteHeader(StatusBadRequest)
     return
}
     h, _ := mux.Handler(r)
    h.ServeHTTP(w, r)
}

从godoc提示可以知道,当一个请求来时,先进行路由匹配,这一过程由ServeMux.m中的string来匹配完成。
匹配成功后选择muxEntry.h所对应的handler进行处理,而这一步是调用ServeHTTP实现。


0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

go语言原生http库分析(1)

构建一个HTTP服务器的简单例子 package main import ( "net/http" ) func SayHello(w http.ResponseWriter, req...
  • idwtwt
  • idwtwt
  • 2016-07-03 23:36
  • 996

Go语言Http Server源码阅读

转自:http://www.cnblogs.com/yjf512/archive/2012/08/22/2650873.html 这篇文章出现的理由是业务上需要创建一个Web Server。创建...
  • LeoHsiun
  • LeoHsiun
  • 2015-04-29 20:24
  • 1509

Go Web编程:http包分析

一个简单的web服务package mainimport ( "io" "log" "net/http" )func HelloGoServer(w http.Response...
  • uudou
  • uudou
  • 2016-10-05 12:22
  • 2406

Go语言net/http 解读.

Http包提供实现HTTP客户端和服务端的方法与函数。 Get、Head、Post、PostForm配合使用实现HTTP请求: resp, err := http.Get("http://exam...
  • fyxichen
  • fyxichen
  • 2015-08-18 11:15
  • 3947

深入源码分析go类型系统

深入源码分析go类型系统   Ø runtime/type.h    go类型描述的静态信息 //type  go类型最通用定义,go的类型系统通过这个数据结构来进行驱动 /...
  • hittata
  • hittata
  • 2016-03-17 17:23
  • 1628

【Go】原生http get和post请求框架

Go语言实现客户端client角色,向其他地址发送Get/Post请求,并获取数据(json格式)头文件引用import( "bytes" "encoding/json" "f...
  • RazilFelix
  • RazilFelix
  • 2017-06-23 15:41
  • 1542

Go网络编程之net/http包执行流程源码分析

1. http包建立web服务器 package main import (     "fmt"     "log"  ...
  • huwh_
  • huwh_
  • 2017-07-30 15:11
  • 563

Go发起Http请求及获取相关参数

golang要请求远程网页,可以使用net/http包中的client提供的方法实现。查看了官方网站有一些示例,没有太全面的例子,于是自己整理了一下。 get请求 get请求可以直接http.Ge...
  • kenkao
  • kenkao
  • 2015-08-22 11:03
  • 26337

Golang Web编程的Get和Post请求发送与解析

本文的是一篇入门文章,通过一个简单的例子介绍Golang的Web编程主要用到的技术。 文章结构包括: Client-Get 请求 Client-Post 请求 ...
  • typ2004
  • typ2004
  • 2014-08-19 15:26
  • 18071

go程序包源码解读——golang.org/x/net/context

强烈建议读者先完成http://blog.golang.org/pipelines的阅读,此文对于go的channel的用法会让初学者有一种豁然开朗的感觉。 简介context是一个在go中时常用到的...
  • xiaohu50
  • xiaohu50
  • 2015-10-13 16:30
  • 5145
    个人资料
    • 访问:34563次
    • 积分:843
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    最新评论