golang的http包笔记

最近打算用golang做项目,看了一下golang的资料,顺便做一下笔记,以供参考,复习.
由于对golang的熟悉度还不是很高,写的有点生疏了,也希望能对大家有帮助吧.
 
示例源码:
packagemain
import(
"log"
"net/http"
)
func helloWorld(whttp.ResponseWriter,r*http.Request){
w.Write([]byte("hello,world!"))
}
func main(){
http.HandleFunc("/",sayHelloName)
err:=http.ListenAndServe(":8080",128); background-color:inherit">nil)
iferr!=nil{
log.Fatal("ListenAndServe:",err)
}
http.HandleFunc() 解读
打开源码包 server.go跳到1775行,看到函数
func HandleFunc(pattern string, handlerfunc(ResponseWriter,192); background-color:inherit"> *Request)) {
DefaultServeMux.HandleFunc(pattern,192); background-color:inherit"> handler)
}
DefaultServeMux的结构如下:
typeServeMuxstructmu    sync.RWMutex
m     map[string]muxEntry
hostsbool//whetheranypatternscontainhostnames
muxEntryexplicitbool
h        Handler
pattern  string
}
DefaultServeMux是一个全局变量在server.go的 1595 行创建的
 NewServeMux() *ServeMux {return &ServeMux{m:make(string]muxEntry)} }
var DefaultServeMux = NewServeMux()
接着跟进 DefaultServeMux.HandleFunc(pattern, handler) 
 (mux *ServeMux)mux.Handle(pattern,192); background-color:inherit"> HandlerFunc(handler))
}
在这个函数里面把前面传进来的helloWorld 函数转换成 HandlerFunc
HandlerFunc的类型如下:
HandlerFunc *Request)
ServeHTTPcallsf(w,0); background-color:inherit">r).
 (fHandlerFunc) ServeHTTP(w ResponseWriter,192); background-color:inherit"> r *Request)f(w,192); background-color:inherit"> r)
HandlerFunc类型实现了方法 ServeHTTP
再跟进Handle函数
 Handle(pattern Handler)mux.mu.Lock()   // 因为map是全局的,涉及到全局调用,因此加锁
defer mux.mu.Unlock()
if pattern ==""panic("http:invalidpattern" + pattern)
}
nilnilhandler")
 mux.m[pattern].explicitmultipleregistrationsformux.m[pattern] muxEntry{explicit:true,192); background-color:inherit"> h: handler,192); background-color:inherit"> pattern: pattern}// 这里注册路由

err := http.ListenAndServe(nil)解读
跟进函数ListenAndServe,内容如下
 ListenAndServe(addrerrorserver := &Server{Addr: addr,192); background-color:inherit"> Handler: handler}
 server.ListenAndServe()
而参数 Handler 是一个接口,内容如下
HandlerinterfaceServeHTTP(ResponseWriter,monospace; background-color:inherit">}
看到 server := &Server{Addr: addr,192); background-color:inherit"> Handler: handler} 这句
因为我们在调用ListenAndServe时,第二个参数是nil,所以这里的handle是nil
继续跟进ListenAndServe内容如下
 (srvServer) ListenAndServe()addr srv.Addr
 addr":http"
ln,192); background-color:inherit"> err net.Listen("tcp",192); background-color:inherit"> addr)  // 在这里调用了tcp监听了
 != err
 srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})
}
跟进 Serve,可以看到在该函数里面调用了rw,192)"> e := l.Accept(),在接受连接的函数
并且每一个连接go c.serve() 创建了一个携程
跟进 c.serve() 可以看到在函数里面对请求调用了 ServeHTTP
serverHandler{c.server}.ServeHTTP(w,192); background-color:inherit"> w.req) 
跟进去内容如下
(shserverHandler)ServeHTTP(rw ResponseWriter,192); background-color:inherit"> req*Request{
handler:= sh.srv.Handler
=={ // 在在这里判断用哪个 handler了
= DefaultServeMux
}
 req.RequestURI "*"&&.Method "OPTIONS" globalOptionsHandler{}
handler.ServeHTTP(rw)
}
很显然看出了,如果在调用err:=http.ListenAndServe(":8080",nil)时,第二个参数是
我们自定义的Handler的话则调用我们的,否则的话就默认调用 DefaultServeMux
由此可以看出,如果我们要自定义Handler的话只要实现ServeHTTP(ResponseWriter,192); background-color:inherit"> *Request)方法即可
例子如下:
package main
import (
"fmt"
"log"
"net/http"
)
MyHandler (thisMyHandler) http.ResponseWriter,192); background-color:inherit"> *http.Request)fmt.Println("myHanlder")
"myHanlder"))
 main()err http.ListenAndServe( &MyHandler{})
"ListenAndServe: err)
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


类型转换 1、int转string 2、string转int 3、string转float 4、用户结构类型转换
package main import s "strings" import "fmt" var p = fmt.Println func main() { p("Contains: ", s.Contains("test&quo
类使用:实现一个people中有一个sayhi的方法调用功能,代码如下: 接口使用:实现上面功能,代码如下:
html代码: beego代码:
1、读取文件信息: 2、读取文件夹下的所有文件: 3、写入文件信息 4、删除文件,成功返回true,失败返回false
配置环境:Windows7+推荐IDE:LiteIDEGO下载地址:http://www.golangtc.com/downloadBeego开发文档地址:http://beego.me/docs/intro/ 安装步骤: 一、GO环境安装 二、配置系统变量 三、Beego安装 一、GO环境安装 根
golang获取程序运行路径:
Golang的文档和社区资源:为什么它可以帮助开发人员快速上手?
Golang:AI 开发者的实用工具
Golang的标准库:为什么它可以大幅度提高开发效率?
Golang的部署和运维:如何将应用程序部署到生产环境中?
高性能AI开发:Golang的优势所在
本篇文章和大家了解一下go语言开发优雅得关闭协程的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1.简介本文将介绍首先为什么需要主...
这篇文章主要介绍了Go关闭goroutine协程的方法,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。1.简介本文将介绍首先为什么需要主动关闭gor...
本篇文章和大家了解一下go关闭GracefulShutdown服务的几种方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。目录Shutdown方法Regi...
这篇文章主要介绍了Go语言如何实现LRU算法的核心思想和实现过程,具有一定借鉴价值,需要的朋友可以参考下。下面就和我一起来看看吧。GO实现Redis的LRU例子常
今天小编给大家分享的是Go简单实现多租户数据库隔离的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会...
这篇“Linux系统中怎么安装NSQ的Go语言客户端”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希
本文小编为大家详细介绍“怎么在Go语言中实现锁机制”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么在Go语言中实现锁机制”文章能帮助大家解决疑惑,下面...
今天小编给大家分享一下Go语言中interface类型怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考