广告
返回顶部
首页 > 资讯 > 后端开发 > GO >Golang HTTP编程源码分析
  • 668
分享到

Golang HTTP编程源码分析

2023-07-05 04:07:14 668人浏览 独家记忆
摘要

这篇文章主要介绍“golang Http编程源码分析”,在日常操作中,相信很多人在Golang HTTP编程源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang H

这篇文章主要介绍“golang Http编程源码分析”,在日常操作中,相信很多人在Golang HTTP编程源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang HTTP编程源码分析”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

1、网络基础

基本tcp客户-服务器程序Socket编程流程如如下图所示。

TCP服务器绑定到特定端口并阻塞监听客户端端连接,

TCP客户端则通过IP+端口向服务器发起请求,客户-服务器建立连接之后就能开始进行数据传输。

Golang HTTP编程源码分析

Golang的TCP编程也是基于上述流程的。

2、Golang HTTP编程

2.1 代码示例

func timeHandler(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "%v", time.Now().FORMat(time.RFC3339))} func helloHandler(w http.ResponseWriter, r *http.Request) {    fmt.Fprintf(w, "%v", "hello world.")} func main() {    // 1. 新建路由解码器    h := http.NewServeMux()    // 2. 路由注册    h.HandleFunc("/hello", helloHandler)    h.HandleFunc("/time", timeHandler)    // 3. 服务启动 阻塞监听    http.ListenAndServe(":8000", h)}

运行上述程序,在浏览器地址栏分别输入 http://localhost:8000/hello http://localhost:8000/time 结果分别如下图所示。

Golang HTTP编程源码分析

Golang HTTP编程源码分析

2.2 源码分析

分析从路由注册到响应用户请求的流程。

2.1 新建解码器 h := http.NewServeMux()

type ServeMux struct {    mu    sync.RWMutex    m     map[string]muxEntry    es    []muxEntry // slice of entries sorted from longest to shortest.    hosts bool       // whether any patterns contain hostnames}type muxEntry struct {    h       Handler    pattern string}// NewServeMux allocates and returns a new ServeMux.func NewServeMux() *ServeMux { return new(ServeMux) }

Handler是interface,定义如下

type Handler interface {    ServeHTTP(ResponseWriter, *Request)}

ServeMux实现了Handler接口。

2.2 路由注册 h.HandleFunc("/hello", helloHandler)

// HandleFunc reGISters the handler function for the given pattern.func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {    ...    mux.Handle(pattern, HandlerFunc(handler))} func (mux *ServeMux) Handle(pattern string, handler Handler) {    ...    e := muxEntry{h: handler, pattern: pattern}    mux.m[pattern] = e    if pattern[len(pattern)-1] == '/' {        mux.es = appendSorted(mux.es, e)    }    ...}

timeHandler和helloHandler函数被强制转换为type HandlerFunc func(ResponseWriter, *Request)类型,且实现了Handler接口。

func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {    f(w, r)}

mux.m建立了路由到处理函数timeHandler和helloHandler的映射。

2.3 服务启动阻塞监听 http.ListenAndServe(":8000", h)

包装Server结构体,HTTP使用TCP协议。

func ListenAndServe(addr string, handler Handler) error {    server := &Server{Addr: addr, Handler: handler}    return server.ListenAndServe()}func (srv *Server) ListenAndServe() error {    ...    ln, err := net.Listen("tcp", addr)    if err != nil {        return err    }    return srv.Serve(ln)}

net.Listen封装了Socket编程的socket,bind,listen的调用,极大的方便了使用者。

阻塞监听请求,新建goroutine处理每个新请求。

func (srv *Server) Serve(l net.Listener) error {    ...    for {        rw, err := l.Accept()        ...        c := srv.newConn(rw)        c.setState(c.rwc, StateNew, runHooks) // before Serve can return        go c.serve(connCtx)    }}// Serve a new connection.func (c *conn) serve(ctx context.Context) {    ...    serverHandler{c.server}.ServeHTTP(w, w.req)    ...}func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {    handler := sh.srv.Handler    ...    handler.ServeHTTP(rw, req)}

通过前面的流程推导可知,handler是http.ListenAndServe的第二个参数ServeMux

// ServeHTTP dispatches the request to the handler whose// pattern most closely matches the request URL.func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request) {    ...    h, _ := mux.Handler(r) // 通过路由获取处理函数    h.ServeHTTP(w, r)}

mux.Handler使用mux.m这个map通过请求URL找到对应处理函数的。

h的实际类型为HandlerFunc,根据2.2.2会调用到具体函数timeHandler或者helloHandler。

到此,关于“Golang HTTP编程源码分析”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

您可能感兴趣的文档:

--结束END--

本文标题: Golang HTTP编程源码分析

本文链接: https://www.lsjlt.com/news/349521.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Golang HTTP编程源码分析
    这篇文章主要介绍“Golang HTTP编程源码分析”,在日常操作中,相信很多人在Golang HTTP编程源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Golang H...
    99+
    2023-07-05
  • Golang HTTP编程的源码解析详解
    目录1、网络基础2、Golang HTTP编程2.1 代码示例2.2 源码分析3. 总结1、网络基础 基本TCP客户-服务器程序Socket编程流程如如下图所示。 TCP服务器绑定到...
    99+
    2023-02-21
    Golang HTTP编程 Go HTTP编程 Golang HTTP
  • Go语言网络编程与Http源码分析
    这篇文章主要介绍“Go语言网络编程与Http源码分析”,在日常操作中,相信很多人在Go语言网络编程与Http源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Go语言网络编程与Http源码分析”的疑惑有所...
    99+
    2023-07-05
  • Golang中sync.Mutex源码分析
    本篇内容介绍了“Golang中sync.Mutex源码分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Mutex结构type M...
    99+
    2023-07-05
  • Golang源码分析之golang/sync之singleflight
    目录1.背景1.1. 项目介绍1.2.使用方法2.源码分析2.1.项目结构2.2.数据结构2.3.API代码流程3.总结1.背景 1.1. 项目介绍 golang/sync库拓展了官...
    99+
    2022-11-13
    golang/sync golang源码分析 golang singleflight
  • ChatGPT前端编程源码分析
    本篇内容主要讲解“ChatGPT前端编程源码分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ChatGPT前端编程源码分析”吧!TDD第一步就卡住了程序运行视图:带着TDD思路,我进入了 ej...
    99+
    2023-07-05
  • golang错误捕获源码分析
    这篇文章主要介绍“golang错误捕获源码分析”,在日常操作中,相信很多人在golang错误捕获源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”golang错误捕获源码分析”的疑惑有所帮助!接下来,请跟...
    99+
    2023-07-06
  • Golang Mutex互斥锁源码分析
    目录前言Mutex 特性数据结构Lock()Unlock()前言 在上一篇文章中,我们一起学习了如何使用 Go 中的互斥锁 Mutex,那么本篇文章,我...
    99+
    2022-11-11
  • Golang通道channel的源码分析
    目录前言channel基础结构channel初始化channel发送channel接收小结前言 channel是golang中标志性的概念之一,很好很强大! channel(通道),...
    99+
    2022-12-08
    Golang通道channel Golang通道 Golang channel
  • Golang中Slice使用源码分析
    本文小编为大家详细介绍“Golang中Slice使用源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang中Slice使用源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1、slice结构体首...
    99+
    2023-07-05
  • golang http 设置编码
    编程语言Golang是一种开发快速、性能出众的编程语言,也是谷歌近年来推出的一种高效而强大的编程语言,他具有语法简单、编译快速、运行效率高的特点,可以实现并发编程,开发网络应用也很方便。 在Golang中,HTTP开发是非常常见的,HTTP...
    99+
    2023-05-14
  • Golang通道channel使用源码分析
    这篇文章主要介绍了Golang通道channel使用源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Golang通道channel使用源码分析文章都会有所收获,下面我们一起来看看吧。前言channel是g...
    99+
    2023-07-04
  • Golang中Slice的分析与使用源码解析
    目录1、slice结构体2、slice初始化3、append操作4、slice截取5、slice深拷贝6、值传递还是引用传递参考文献1、slice结构体 首先我们来看一段代码 pac...
    99+
    2023-03-09
    go slice使用 go slice
  • GoLang OS包及File类型源码分析
    这篇文章主要介绍“GoLang OS包及File类型源码分析”,在日常操作中,相信很多人在GoLang OS包及File类型源码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”GoLan...
    99+
    2023-07-05
  • Golang内存模型实例源码分析
    这篇文章主要介绍“Golang内存模型实例源码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Golang内存模型实例源码分析”文章能帮助大家解决问题。1. 简介(Introduction)Go ...
    99+
    2023-07-05
  • Immutable.js到Redux函数式编程源码分析
    这篇文章主要介绍了Immutable.js到Redux函数式编程源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Immutable.js到Redux函数式编程源码分析文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • JUC并发编程LinkedBlockingQueue队列源码分析
    这篇文章主要介绍了JUC并发编程LinkedBlockingQueue队列源码分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇JUC并发编程LinkedBlockingQueue队列源码分析文章都会有所收获,...
    99+
    2023-07-06
  • java编程ThreadLocal上下传递源码分析
    这篇文章主要讲解了“java编程ThreadLocal上下传递源码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“java编程ThreadLocal上下传递源码分析”吧!引导语Thread...
    99+
    2023-06-29
  • GoLang string与strings.Builder使用源码对比分析
    本文小编为大家详细介绍“GoLang string与strings.Builder使用源码对比分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“GoLang string与strings.Builder使用源码对比分析...
    99+
    2023-07-05
  • Vue编译器optimize源码分析
    目录引言optimize 源码之旅markStatic$1源码isStatic源码复杂点的回归到markStatic$1markStaticRoots 源码引言 接上文 p...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作