golang实现lru golang init执行顺序
defer在go中的执行顺序是后进先出(lifo),1.遇到defer语句时,函数调用会被压入栈中,2.当前函数返回前面,栈顶的defer函数依次弹出执行;例如连续两个defer,后写的先执行。defer参数在注册时求值,如i不影响已保存的值。返回前会执行defer,可能影响命名返回值的结果。注意事项包括:避免循环中间隔使用defer、不要defer中做运行操作、注意作用范围及反应。
在Golang中,defer是一个非常实用的关键字,用于延迟执行某个函数调用,通常用于资源释放、锁定的释放等场景。但很多人刚接触时会执行顺序感到困惑,尤其是当多个defer 出现的时候。
其实,只要理解 defer 的底层机制是基于栈结构实现的,它的执行顺序就很容易理解了。defer 的执行顺序是后进先出(LIFO)
Golang 遇到 defer 语句时,并不会立即执行对应的函数,而是将其压入一个函数调用栈中。直到当前函数即将返回之前,才会从栈顶开始依次弹出并执行这些被推迟的函数调用。
立即学习“go语言免费学习笔记(深入)”;
举个简单的例子:func main() { defer fmt.Println(quot;firstquot;) defer fmt.Println(quot;secondquot;) fmt.Println(quot;hello worldquot;)}登录后复制
输出结果是:hello worldsecondfirst登录后复制
虽然两个defer是按顺序写的,但由于它们被压入栈中,执行顺序就是依次的。和我们日常理解的“最后写的先执行”是一致的。defer与函数参数求值时机
一个容易忽略的细节是:defer后面的这个函数参数是在defer被执行时就完成真正求值的,而不是等到执行该函数时才计算。
看个例子:func demo() { i := 0 defer fmt.Println(i) i }登录后复制
可能代码输出是0,不是1。因为i的值在defer执行时就已经确定为0了,后续的i并不会影响已经保存下来的值。
所以记住一点:defer注册时就完成了求参数值。defer与return的关系
很多人以为return之后就不能再执行 defer 了,实际上不行。在函数返回前,会先处理所有注册好的 defer 调用,然后再真正退出函数。
例如:func f() int { var i int defer func() { i }() return i}登录后复制
这个函数返回的其实是 1,而不是 0。因为 return i 的值已经准备好了,但是在返回前执行了 defer,了i 的值。
情况说明:defer 可以影响带命名返回值的此类函数的结果。使用 defer 的一些注意事项不要在循环中延迟使用,可能会导致性能问题。
避免在 defer 中做运行操作,因为它会影响函数的返回速度。defer 的作用范围是函数级别的,不能修改跨函数调用。如果 defer 函数有结果(比如变量),要特别注意它的执行顺序。
总的来说,理解 defer的执行顺序并不难,关键在于它背后的“栈结构”。掌握了这一点,很多出现奇怪的行为机制其实都合情合理。
基本上就这些,不复杂,但很容易忽略。
以上就是Golang defer关键字的执行顺序结合关注关注机制解释延迟调用机制的详细内容,更多请乐哥常识网相关文章!