第 8 期 2018-05-31 线下活动 - Go 标准包 net/http 源码阅读(二)

观看视频

Go 标准包阅读

基于 Go 1.10.2

net/http

  • server.go

问题

func (s *Server) doKeepAlives() bool {
	return atomic.LoadInt32(&s.disableKeepAlives) == 0 && !s.shuttingDown()
}

为什么要用 atomic.LoadInt32(&s.disableKeepAlives) == 0

原子操作比用锁更节约一点性能。

  1. server.go#Shutdown 不保险

  2. panicChan := make(chan interface{}, 1)

	panicChan := make(chan interface{}, 1)
	go func() {
		defer func() {
			if p := recover(); p != nil {
				panicChan <- p
			}
		}()
		h.handler.ServeHTTP(tw, r)
		close(done)
	}()
	select {
	case p := <-panicChan:
		panic(p)
		...

外部处理就不能按照你的意愿去处理了,如果不拿出来,那么进程就挂掉了。

  1. // Deprecated: ErrWriteAfterFlush is no longer used.
    ErrWriteAfterFlush = errors.New(“unused”)

  2. Header() Header 注释引发的Trailer的思考?



延伸阅读

  1. HTTP Chunked Body/Trailer编码
  2. example_ResponseWriter_trailers
  3. HTTP Header Trailer