作者回复: 你好,你的逻辑是正确的,不过可能过多关注分支细节。在使用思维导图的时候,如果对于比较复杂的逻辑,我们需要分析哪些是关键节点,哪些是非关键节点。 比如FileServer, 其关键点有两个: 1 fileHandler 我们能和ListenAndServe 连接起来,它提供了ServeHTTP的方法, 这个是请求处理的入口函数 2 FileServer 最本质的函数是封装了io.CopyN,基本逻辑是: 如果是读取文件夹,则遍历文件夹内所有文件,将文件名直接输出返回值。 如果是读取文件,则设置文件的阅读指针(如果需要多次读取文件,创建goroutine,且为每个goroutine创建阅读指针),使用io.CopyN读取文件内容输出返回值。
作者回复: 恩,我平时阅读源码就是这样阅读的。经验之谈。感谢支持。
作者回复: http服务在启动的时候,会默认开启keep-alive机制。keep-alive机制就是一个连接在一个请求结束之后,并不关闭当前连接,在下个请求的时候也能使用这个连接。这个for循环就是为keep-alive机制服务的。在服务一个连接的时候,处理完一个请求,并不关闭这个连接,而是循环等待下个请求。 那要关闭keep-alive怎么办呢?你也可以在for循环中的w.conn.server.doKeepAlives 看到,它判断如果服务端的 disableKeepAlives 不是0,则设置了关闭keep-alive,则就不进行for循环了。
作者回复: 你好,在后面有一章会专门介绍目录的章节,叫《如何系统设计框架的整体目录》。每一个章节,我都有存放源码在github项目的对应分支,如果希望跟着上手敲一遍,可以跟着文章敲完代码,跟着对应分支对一遍。https://github.com/gohade/coredemo/tree/geekbang/01 谢谢支持,另外为你的ID middleware 点个赞。
作者回复: 你好,非常感谢支持。非常高兴本篇能让你有一些收获。后续文章是介绍写框架的过程的。感谢。
作者回复: 👍坚持一起仗剑走天涯
作者回复: 是的,确实是顺序错误,已经联系编辑进行修改了。感谢提醒。
作者回复: 是的,主要在于第六层的ServeHTTP,不同的handler实现的ServeHTTP是不一样的。
作者回复: 感谢
作者回复: 这个是gomod的机制,如果你的项目在gomod中命名为coredemo, 那么coredemo/framework就会去你的项目下的framework目录查询,当然你这里也能写成./framework。但是别人用到你的库的时候就会出现错误