Golang知识点七、defer

defer

  从本篇文章开始记录defer相关的知识点,defer相关的内容包括部分

  defer会在函数返回之前倒序执行,下面是一段go代码,及其在编译后的伪指令描述。

	func A() {
		defer B()
		// code to do something
	}
	func A() {
			r = deferproc(8, B)
			if r > 0 {
				goto ret
			}
			
			// code to do something
	
			runtime.deferreturn()
		ret
			runtime.deferreturn()
	}

  defer指令对应到两部分内容,deferproc负责把要执行的函数信息保存起来,称为defer注册。defer注册完成后,继续执行后面的逻辑,直到返回前通过deferreturn执行注册的defer函数。正是由于先注册,后调用的机制,才实现了defer延迟 执行的效果。

  defer信息会注册到一个链表,当前执行的goroutine持有这个链表头指针,将一个个_defer结构体进行链接,新注册的defer会添加到链表头,执行时也是从头开始,这也是defer表现为倒序执行的原因。

上一篇:使用Javascript


下一篇:golang中的defer函数和return语句两者的执行顺序