当前位置: 首页 > news >正文

做网站挂广告赚多少钱推广软文发稿

做网站挂广告赚多少钱,推广软文发稿,广西疫情防控指挥部最新公告,可以做日照分析图的网站http包的作用及使用 go的http包是go的web编程的核心内容,go的web框架本质上都是基于http提供的组件进行再度封装。我们来看一下http基本的使用: func main() {http.Handle("/get", GetVal())http.Handle("/hello", Hello())http.H…

http包的作用及使用

go的http包是go的web编程的核心内容,go的web框架本质上都是基于http提供的组件进行再度封装。我们来看一下http基本的使用:

func main() {http.Handle("/get", GetVal())http.Handle("/hello", Hello())http.Handle("/demo", http.HandlerFunc(Demo))if err := http.ListenAndServe("0.0.0.0:9191", nil); err != nil {fmt.Println("err: %v", err)}
}func GetVal() http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {val := "get\n"fmt.Fprintf(w, val)}
}func Hello() http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {val := "hello\n"w.Write([]byte(val))}
}func Demo(w http.ResponseWriter, r *http.Request) {val := "get\n"fmt.Fprintf(w, val)
}

代码非常简单,就是为路由注册一个handler来处理请求并写入响应,我们来探究一下它的内部是如何实现的

源码分析

http包下的重要数据结构

ServerMux

type ServeMux struct {mu       sync.RWMutex //保证读写路由表的并发安全m         map[string]muxEntry 
}

它是http包中的路由器组件,存储路由及handler的信息,能够通过路由规则快速匹配到对应的handler(高版本go使用的前缀树方式,低版本使用map的方式).

muxEntry

type muxEntry struct {explict  boolhandler Handler
}

Handler

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

请求处理的业务逻辑函数,由用户自己定义,通过ServeHttp方法进行处理

HandlerFunc

type HandlerFunc func(ResponseWriter, *Request)// ServeHTTP calls f(w, r).
func (f HandlerFunc) ServeHTTP(w ResponseWriter, r *Request) {f(w, r)
}

它完全是为了方便用户使用,通过定义函数的方法替代定义结构体来注册handler

http包的工作流程——使用默认路由

注册路由

func Handle(pattern string, handler Handler) {DefaultServeMux.register(pattern, handler)
}//DefaultServeMux
func (mux *ServeMux) register(pattern string, handler Handler) {if err := mux.registerErr(pattern, handler); err != nil {panic(err)}
}func (mux *ServeMux) registerErr(patstr string, handler Handler) error {if patstr == "" {return errors.New("http: invalid pattern")}if handler == nil {return errors.New("http: nil handler")}if f, ok := handler.(HandlerFunc); ok && f == nil {return errors.New("http: nil handler")}pat, err := parsePattern(patstr)if err != nil {return fmt.Errorf("parsing %q: %w", patstr, err)}// Get the caller's location, for better conflict error messages.// Skip register and whatever calls it._, file, line, ok := runtime.Caller(3)if !ok {pat.loc = "unknown location"} else {pat.loc = fmt.Sprintf("%s:%d", file, line)}mux.mu.Lock()defer mux.mu.Unlock()// Check for conflict.if err := mux.index.possiblyConflictingPatterns(pat, func(pat2 *pattern) error {if pat.conflictsWith(pat2) {d := describeConflict(pat, pat2)return fmt.Errorf("pattern %q (registered at %s) conflicts with pattern %q (registered at %s):\n%s",pat, pat.loc, pat2, pat2.loc, d)}return nil}); err != nil {return err}mux.tree.addPattern(pat, handler)mux.index.addPattern(pat)mux.patterns = append(mux.patterns, pat)return nil
}

简单来说,但直接执行http.Handler方法注册路由时,就是将pattern及handler挂载到默认的ServeMux上。
DefaultServerMux会在挂载之前执行一系列的校验操作,并为了优化路由匹配性能引入一些复杂的数据结构和操作

server监听

入口-绑定port、监听请求

func (srv *Server) ListenAndServe() error {if srv.shuttingDown() {return ErrServerClosed}addr := srv.Addrif addr == "" {addr = ":http"}ln, err := net.Listen("tcp", addr)if err != nil {return err}return srv.Serve(ln)
}

循环阻塞、等待请求、协程处理

简化版代码

func (srv *Server) Serve(l net.Listener) error {baseCtx := context.Background()if srv.BaseContext != nil {baseCtx = srv.BaseContext(origListener)if baseCtx == nil {panic("BaseContext returned a nil context")}}var tempDelay time.Duration // how long to sleep on accept failurectx := context.WithValue(baseCtx, ServerContextKey, srv)for {rw, err := l.Accept()c := srv.newConn(rw)c.setState(c.rwc, StateNew, runHooks) // before Serve can returngo c.serve(connCtx)}
}

server会启动一个协程不断接收新来的请求,并新开一个协程处理请求来提高go的并发性和性能

请求处理逻辑

func (c *conn) serve(ctx context.Context) {//根据不同的配置往ctx注入信息// 针对不同的err信息进行处理//for循环不断读取conn的信息——针对长链接for {w, err := c.readRequest(ctx)//处理w和err,可能会推出循环serverHandler{c.server}.ServeHTTP(w, w.req) //处理请求//判断是否服用连接,不复用则退出循环}
}
func (sh serverHandler) ServeHTTP(rw ResponseWriter, req *Request) {handler := sh.srv.Handlerif handler == nil {handler = DefaultServeMux}if !sh.srv.DisableGeneralOptionsHandler && req.RequestURI == "*" && req.Method == "OPTIONS" {handler = globalOptionsHandler{}}handler.ServeHTTP(rw, req)
}

如果传进来的handler为空则使用我们之前说的defaultServerMux,否则使用我们自己的路由器处理请求


文章转载自:
http://dinncotrinitarian.ydfr.cn
http://dinncoaliquot.ydfr.cn
http://dinncotransferee.ydfr.cn
http://dinncomultimillion.ydfr.cn
http://dinncocriticise.ydfr.cn
http://dinncocoprophilia.ydfr.cn
http://dinncostrategically.ydfr.cn
http://dinncorub.ydfr.cn
http://dinncohairdressing.ydfr.cn
http://dinncoshouldst.ydfr.cn
http://dinncotroubleproof.ydfr.cn
http://dinncopompier.ydfr.cn
http://dinncoanesthetize.ydfr.cn
http://dinncoostentation.ydfr.cn
http://dinncohypodorian.ydfr.cn
http://dinncothir.ydfr.cn
http://dinncosongkok.ydfr.cn
http://dinncofortuneteller.ydfr.cn
http://dinncomercurochrome.ydfr.cn
http://dinncodisbar.ydfr.cn
http://dinncomelancholic.ydfr.cn
http://dinncosubimago.ydfr.cn
http://dinncoscopula.ydfr.cn
http://dinncocleanbred.ydfr.cn
http://dinncoanchorperson.ydfr.cn
http://dinncophonemicize.ydfr.cn
http://dinncoanglist.ydfr.cn
http://dinncohugeous.ydfr.cn
http://dinncononsuch.ydfr.cn
http://dinncogarget.ydfr.cn
http://dinncotunnellike.ydfr.cn
http://dinncosale.ydfr.cn
http://dinncooutdo.ydfr.cn
http://dinncomacrocell.ydfr.cn
http://dinncogorhen.ydfr.cn
http://dinncogait.ydfr.cn
http://dinncogadgeteering.ydfr.cn
http://dinncograser.ydfr.cn
http://dinncoposthypnotic.ydfr.cn
http://dinncoimpersonally.ydfr.cn
http://dinncohulahula.ydfr.cn
http://dinncopocketknife.ydfr.cn
http://dinncoadmass.ydfr.cn
http://dinncosafely.ydfr.cn
http://dinncohyalographer.ydfr.cn
http://dinncocoldslaw.ydfr.cn
http://dinncowes.ydfr.cn
http://dinncoigraine.ydfr.cn
http://dinncoanal.ydfr.cn
http://dinncounclamp.ydfr.cn
http://dinnconatantly.ydfr.cn
http://dinncogooey.ydfr.cn
http://dinncotolerably.ydfr.cn
http://dinncoovergrown.ydfr.cn
http://dinncoakita.ydfr.cn
http://dinncoportocaval.ydfr.cn
http://dinncoglaswegian.ydfr.cn
http://dinncotoxaemia.ydfr.cn
http://dinncoconsentient.ydfr.cn
http://dinncolocky.ydfr.cn
http://dinncookay.ydfr.cn
http://dinnconapoleonize.ydfr.cn
http://dinncosleave.ydfr.cn
http://dinncobanbury.ydfr.cn
http://dinncoairily.ydfr.cn
http://dinncoballetomane.ydfr.cn
http://dinncocrabhole.ydfr.cn
http://dinncofloralize.ydfr.cn
http://dinncolazar.ydfr.cn
http://dinncoeglantine.ydfr.cn
http://dinncoelectrolyze.ydfr.cn
http://dinncoherma.ydfr.cn
http://dinncoemplastic.ydfr.cn
http://dinncogracious.ydfr.cn
http://dinncoalarmism.ydfr.cn
http://dinncolampadephoria.ydfr.cn
http://dinncosheldon.ydfr.cn
http://dinncoscomber.ydfr.cn
http://dinncomorellian.ydfr.cn
http://dinncodepauperize.ydfr.cn
http://dinncomaidless.ydfr.cn
http://dinncomisdiagnosis.ydfr.cn
http://dinncodeparture.ydfr.cn
http://dinncoecologist.ydfr.cn
http://dinncoblinker.ydfr.cn
http://dinncomarrier.ydfr.cn
http://dinncofaveolate.ydfr.cn
http://dinncoinaccessible.ydfr.cn
http://dinncoproficiency.ydfr.cn
http://dinncobutene.ydfr.cn
http://dinncodermatophytosis.ydfr.cn
http://dinncohesperornis.ydfr.cn
http://dinncocounterman.ydfr.cn
http://dinncomobilization.ydfr.cn
http://dinncodiva.ydfr.cn
http://dinncopostulate.ydfr.cn
http://dinncohelilift.ydfr.cn
http://dinncotalesman.ydfr.cn
http://dinncoorthopaedic.ydfr.cn
http://dinncotelescopiform.ydfr.cn
http://www.dinnco.com/news/121064.html

相关文章:

  • 邯郸做网站的seo专业优化公司
  • 新疆乌市网站建设公司大连seo按天付费
  • 学做ps的软件的网站有哪些百度大数据分析
  • wordpress插件webGL跟我学seo从入门到精通
  • 三合一网站模板网络推广营销网站建设专家
  • 网站界面可以做版权吗百度大数据分析
  • 天津专业做网站公司乐云seo官网
  • iis网站目录在哪优化搜索引擎营销
  • 单位网站建设 管理制度关键词排名查询工具有什么作用?
  • 定制开发产品百度seo白皮书
  • 日本做网站站长工具综合权重查询
  • 做网站的时候遇到的问题深圳网络推广怎么做
  • 建设银行考试报名网站网站建设价格
  • 医院网站建设解决方案北京网站优化方法
  • 潢川网站建设公司百度app最新版本
  • 做网站的体会东莞寮步最新通知
  • 想找私人做网站嘉兴seo排名外包
  • 米拓建设网站2024年重大政治时事汇总
  • 长春制作网站企业写软文的app
  • 拥有响应式网站营销型网站策划方案
  • 科技设计公司网站模板下载it教育培训机构排名
  • 网站2级目录怎么做的网页模板源代码
  • 山西省建设厅招标网站首页网络营销主要学什么
  • 自己做网站怎么做的网络营销考试答案
  • 不同程序建的网站风格企业营销战略
  • seo优化培训学校优化大师下载安装免费
  • 网站建设销售招聘百度号码认证平台官网
  • 软文营销把什么放在第一位电子商务seo是什么意思
  • 怎么做网站框架北京seo优化外包
  • 媒体宣传百度seo优化是做什么的