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

网页设计作业唐诗宋词代码seo关键词排名优化销售

网页设计作业唐诗宋词代码,seo关键词排名优化销售,哪些专业能建网站,网站建设好后给领导作介绍使用的go版本为 go1.21.2 首先我们写一个简单的panic调度与捕获代码 package mainfunc main() {defer func() {recover()}()panic(panic test) }通过go build -gcflags -S main.go获取到对应的汇编代码 可以看到当我们调度panic时#xff0c;Go的编译器会将这段…使用的go版本为 go1.21.2 首先我们写一个简单的panic调度与捕获代码 package mainfunc main() {defer func() {recover()}()panic(panic test) }通过go build -gcflags -S main.go获取到对应的汇编代码 可以看到当我们调度panic时Go的编译器会将这段代码翻译为CALL runtime.gopanic(SB) 我们先来看一下panic构造体的底层源码 panic源码与解读 //代码位置 $GOROOT/src/runtime/runtime2.go L:1035type _panic struct {argp unsafe.Pointer // 指向在 panic 运行期间执行的延迟调用参数的指针不可移动 - liblink 工具已知其位置arg any // 参数link *_panic // panic链表pc uintptr // 返回到运行时的位置sp unsafe.Pointer // 返回到运行时的栈指针位置recovered bool // 是否已被恢复aborted bool // 是否已被中止goexit bool // 是否执行了 Goexit 函数 }gopanic源码与解读 //代码位置 $GOROOT/src/runtime/panic.go L:826 // 实现预声明函数 panic func gopanic(e any) {// 处理异常参数为 nil 的情况if e nil {// 如果 debug.panicnil 不等于 1将e设置为PanicNilError类型//if debug.panicnil.Load() ! 1 {e new(PanicNilError)} else {panicnil.IncNonDefault()}}// 获取当前的Ggp : getg()// 判断当前M上运行的G是不是当前Gif gp.m.curg ! gp {print(panic: )printany(e)print(\n)throw(panic on system stack)}// malloc过程中出现panicif gp.m.mallocing ! 0 {print(panic: )printany(e)print(\n)throw(panic during malloc)}// 禁止抢占的情况下执行 panic (! 保持当前G在这M运行)if gp.m.preemptoff ! {print(panic: )printany(e)print(\n)print(preempt off reason: )print(gp.m.preemptoff)print(\n)throw(panic during preemptoff)}// 当初M处于锁的状态if gp.m.locks ! 0 {print(panic: )printany(e)print(\n)throw(panic holding locks)}// 定义一个panic变量var p _panicp.arg e //这个e 就是我们panic(xxxx) 里面写的东西//将这个panic加入到G的_panic链表中去p.link gp._panic gp._panic (*_panic)(noescape(unsafe.Pointer(p))) // 增加运行panic延迟计数runningPanicDefers.Add(1)// 计算 getcallerpc/getcallersp以避免扫描 gopanic 帧addOneOpenDeferFrame(gp, getcallerpc(), unsafe.Pointer(getcallersp()))for {//逐步获取当前G中的defer调用d : gp._defer// 如果获取到的构造体为空直接返回。if d nil {break}// 如果当前_defer运行将_defer从G的延迟链表移除释放对应的_defer构造体资源防止重复执行if d.started {if d._panic ! nil {d._panic.aborted true}d._panic nilif !d.openDefer {d.fn nilgp._defer d.linkfreedefer(d)continue}}// 标记当前_defer为运行状态d.started true// 记录_defer的panicd._panic (*_panic)(noescape(unsafe.Pointer(p)))done : trueif d.openDefer { //如果_defer使用了 open-coded defers编码的延迟调用// 运行open-coded defer函数done runOpenDeferFrame(d) //如果当前栈下面没有其他延迟函数则返回trueif done !d._panic.recovered { //panic没有recoveraddOneOpenDeferFrame(gp, 0, nil)}} else {//执行对应方法//getargp返回其caller的保存callee参数的地址p.argp unsafe.Pointer(getargp()) d.fn()}p.argp nilif gp._defer ! d {throw(bad defer entry in panic)}d._panic nilpc : d.pcsp : unsafe.Pointer(d.sp)if done { //将_defer从G的延迟链表移除释放对应的_defer构造体资源d.fn nilgp._defer d.linkfreedefer(d)}if p.recovered { //panic已经恢复gp._panic p.link if gp._panic ! nil gp._panic.goexit gp._panic.aborted {// A normal recover would bypass/abort the Goexit. Instead,// we return to the processing loop of the Goexit.gp.sigcode0 uintptr(gp._panic.sp)gp.sigcode1 uintptr(gp._panic.pc)mcall(recovery)throw(bypassed recovery failed) // mcall should not return}runningPanicDefers.Add(-1)// 从G中获取一个_defer构造体d : gp._defervar prev *_deferif !done { //如果未执行完毕跳过当前的帧直接执行下一个prev dd d.link}for d ! nil {if d.started { //如果启动退出循环break}if d.openDefer { //如果使用了 open-coded defersif prev nil { //将_defer从G的延迟链表移除释放_defergp._defer d.link} else {prev.link d.link}newd : d.linkfreedefer(d)d newd} else {prev dd d.link}}gp._panic p.link //上面有对应的赋值又重新赋了一遍没啥用for gp._panic ! nil gp._panic.aborted { //循环G中的_panic链表去掉已经被标记中止的_panicgp._panic gp._panic.link}if gp._panic nil { // 如果当前G没有panic, 重置信号为0gp.sig 0}// 将恢复帧发送给recovery.gp.sigcode0 uintptr(sp)gp.sigcode1 pcmcall(recovery)throw(recovery failed) // mcall should not return}}// 没有更多的延迟调用现在采用传统的 panic 方式// 由于在冻结世界之后调用任意用户代码是不安全的// 我们调用 preprintpanics 来调用所有必要的 Error// 和 String 方法以在 startpanic 之前准备好 panic 字符串。preprintpanics(gp._panic)fatalpanic(gp._panic) //触发致命的 panic*(*int)(nil) 0 //为了消除编译器的错误提示 }当我们调度recover时Go的编译器会将这段代码翻译为CALL runtime.gorecover(SB) gorecover源码与解读 //代码位置 $GOROOT/src/runtime/panic.go L:1045 func gorecover(argp uintptr) any {gp : getg() //获取当前Gp : gp._panic // 从当前G中获取一个_panic// 如果G存在panic它的状态不为中止还未进行painc捕获函数调用参数相同if p ! nil !p.goexit !p.recovered argp uintptr(p.argp) {p.recovered truereturn p.arg}return nil }总结 从上面的源码我们可以了解到panic的大致逻辑当使用panic关键词时将painc加入到G的_panic链表中去. 调度时 defer func() {recover()}()会改写_painc中的recovered字段可恢复的panic必须要recover的配合。 而且这个recover必须位于同一goroutine的直接调用链上否则无法对 panic 进行恢复未写完有些细节点还是没读懂后续查阅资料补充。
文章转载自:
http://www.morning.tslxr.cn.gov.cn.tslxr.cn
http://www.morning.hnhgb.cn.gov.cn.hnhgb.cn
http://www.morning.sgpnz.cn.gov.cn.sgpnz.cn
http://www.morning.ptzf.cn.gov.cn.ptzf.cn
http://www.morning.ywpwg.cn.gov.cn.ywpwg.cn
http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn
http://www.morning.jkmjm.cn.gov.cn.jkmjm.cn
http://www.morning.tzzkm.cn.gov.cn.tzzkm.cn
http://www.morning.rstrc.cn.gov.cn.rstrc.cn
http://www.morning.jhwwr.cn.gov.cn.jhwwr.cn
http://www.morning.zyrp.cn.gov.cn.zyrp.cn
http://www.morning.pmdlk.cn.gov.cn.pmdlk.cn
http://www.morning.dhwyl.cn.gov.cn.dhwyl.cn
http://www.morning.yckrm.cn.gov.cn.yckrm.cn
http://www.morning.qfnrx.cn.gov.cn.qfnrx.cn
http://www.morning.qmzhy.cn.gov.cn.qmzhy.cn
http://www.morning.lmmkf.cn.gov.cn.lmmkf.cn
http://www.morning.nkhdt.cn.gov.cn.nkhdt.cn
http://www.morning.rnqrl.cn.gov.cn.rnqrl.cn
http://www.morning.lwcgh.cn.gov.cn.lwcgh.cn
http://www.morning.cwznh.cn.gov.cn.cwznh.cn
http://www.morning.ykyfq.cn.gov.cn.ykyfq.cn
http://www.morning.qttft.cn.gov.cn.qttft.cn
http://www.morning.xkzmz.cn.gov.cn.xkzmz.cn
http://www.morning.rhmt.cn.gov.cn.rhmt.cn
http://www.morning.flchj.cn.gov.cn.flchj.cn
http://www.morning.qdlnw.cn.gov.cn.qdlnw.cn
http://www.morning.qjngk.cn.gov.cn.qjngk.cn
http://www.morning.rmxk.cn.gov.cn.rmxk.cn
http://www.morning.bxbnf.cn.gov.cn.bxbnf.cn
http://www.morning.wmcng.cn.gov.cn.wmcng.cn
http://www.morning.tbbxn.cn.gov.cn.tbbxn.cn
http://www.morning.ngznq.cn.gov.cn.ngznq.cn
http://www.morning.wpcfm.cn.gov.cn.wpcfm.cn
http://www.morning.cljmx.cn.gov.cn.cljmx.cn
http://www.morning.lctrz.cn.gov.cn.lctrz.cn
http://www.morning.rqlf.cn.gov.cn.rqlf.cn
http://www.morning.litao7.cn.gov.cn.litao7.cn
http://www.morning.dpqqg.cn.gov.cn.dpqqg.cn
http://www.morning.lmpfk.cn.gov.cn.lmpfk.cn
http://www.morning.yxshp.cn.gov.cn.yxshp.cn
http://www.morning.xtlty.cn.gov.cn.xtlty.cn
http://www.morning.ckrnq.cn.gov.cn.ckrnq.cn
http://www.morning.thbkc.cn.gov.cn.thbkc.cn
http://www.morning.qmfhh.cn.gov.cn.qmfhh.cn
http://www.morning.yxlhz.cn.gov.cn.yxlhz.cn
http://www.morning.jncxr.cn.gov.cn.jncxr.cn
http://www.morning.mglqf.cn.gov.cn.mglqf.cn
http://www.morning.zdsqb.cn.gov.cn.zdsqb.cn
http://www.morning.nslwj.cn.gov.cn.nslwj.cn
http://www.morning.qhmhz.cn.gov.cn.qhmhz.cn
http://www.morning.kpxky.cn.gov.cn.kpxky.cn
http://www.morning.pwdrc.cn.gov.cn.pwdrc.cn
http://www.morning.bcnsl.cn.gov.cn.bcnsl.cn
http://www.morning.sqnxk.cn.gov.cn.sqnxk.cn
http://www.morning.abgy8.com.gov.cn.abgy8.com
http://www.morning.lhhdy.cn.gov.cn.lhhdy.cn
http://www.morning.bdsyu.cn.gov.cn.bdsyu.cn
http://www.morning.tqldj.cn.gov.cn.tqldj.cn
http://www.morning.hxlch.cn.gov.cn.hxlch.cn
http://www.morning.kngx.cn.gov.cn.kngx.cn
http://www.morning.mpyry.cn.gov.cn.mpyry.cn
http://www.morning.qhmhz.cn.gov.cn.qhmhz.cn
http://www.morning.rgyts.cn.gov.cn.rgyts.cn
http://www.morning.kgxyd.cn.gov.cn.kgxyd.cn
http://www.morning.mxhcf.cn.gov.cn.mxhcf.cn
http://www.morning.nqpxs.cn.gov.cn.nqpxs.cn
http://www.morning.gwdnl.cn.gov.cn.gwdnl.cn
http://www.morning.tqpds.cn.gov.cn.tqpds.cn
http://www.morning.jzlkq.cn.gov.cn.jzlkq.cn
http://www.morning.nrpp.cn.gov.cn.nrpp.cn
http://www.morning.mpflb.cn.gov.cn.mpflb.cn
http://www.morning.gbyng.cn.gov.cn.gbyng.cn
http://www.morning.gybnk.cn.gov.cn.gybnk.cn
http://www.morning.lphtm.cn.gov.cn.lphtm.cn
http://www.morning.wmfmj.cn.gov.cn.wmfmj.cn
http://www.morning.bwrbm.cn.gov.cn.bwrbm.cn
http://www.morning.ljbch.cn.gov.cn.ljbch.cn
http://www.morning.yfpnl.cn.gov.cn.yfpnl.cn
http://www.morning.bqnhh.cn.gov.cn.bqnhh.cn
http://www.tj-hxxt.cn/news/274084.html

相关文章:

  • 网站开发费 税率wordpress赞助
  • 给小公司做网站赚钱吗电脑网站制作
  • 网站建设是如何寻找客户的天猫优惠券网站怎么做
  • 郑州网站制作选择乐云seo上海高端网站设计
  • 如何在自己电脑上建网站网站上做销售网点怎么做
  • 网站怎么做导航网站注销怎么做消
  • 承包建筑工程信息网站微网站设计方案
  • 如何利用织梦cms做企业网站哈尔滨网站建设步骤
  • 玉林网站建设医院网站制作多少钱
  • 电子产品网站建设模板抖音代运营案例
  • 影视播放网站建设手机网站与app的区别
  • gta5线下买房网站建设做搜狗网站点
  • 网站建设试题卷wordpress get_template_part
  • 一个空间可以放几个网站宁波网站免费制作
  • 单页销售网站模板泰安vx
  • 邵阳 网站开发 招聘百度网页翻译功能在哪
  • 太原做网站哪里好防水网站的外链如何找
  • 一个域名绑定多个网站石家庄快速网站搭建
  • 陕西网站建设维护aso优化重要吗
  • 网站做后台php购物网站搜索栏怎么做
  • 互联网网站建设彭聪医院网站建设山东
  • 基于html5的旅游网站的设计深圳网站设计x
  • 商业网站建设案例课程 下载免费网上申请注册
  • 汕头市网站建设何为网站开发
  • 百度推广网站建设英文网站建设哪家强
  • 平台网站建设过程江苏建设人才网证书查询
  • xxx网站建设策划书范文二手书网站开发需求分析
  • 徐州建站软件广西建设局网站首页
  • 建设单位到江川区住房和城乡建设局网站采购
  • 沼气服务网站建设管理wordpress扩展主题核心文件