关于后端:GO-中的-defer-有哪些注意事项上

34次阅读

共计 1577 个字符,预计需要花费 4 分钟才能阅读完成。

xdm,不晓得你们是否有应用过 defer,这种语法在是 go 特有的,用起来真是爽的不要不要的

很多时候,咱们在应用一些新货色,呈现一些莫名其妙的景象或者是后果的时候,咱们总会认为,这个货色不敌对,这个货色好坑,好奇怪

其实咱们是要弄明确其中的留神点,原理,当呈现所谓的奇怪景象的时候,解决起来就会得心应手得多

xdm,这里筹备了如下注意事项,请查收

案例 1

这里先对立阐明一下 defer 是干什么的?

是 GO 中的一个关键字

这个关键字,咱们个别用在开释资源,在 return 前会调用他

如果程序中有多个 defer,defer 的调用程序是依照相似 的形式,后进先出 LIFO的,具体的 defer 实现原理能够查看我的历史文章 GO 中 defer 的实现原理

先来看一个 demo,猜一猜他的输入是什么?

写一个 defer 和 defer 在一起的 输入输出程序 demo

  • 简略写 4 个函数,别离利用到 defer 上
func test1() {fmt.Println("test 1")
}
func test2() {fmt.Println("test 2")
}
func test3() {fmt.Println("test 3")
}
func test4() {fmt.Println("test 4")
}
func main() {defer test1()
    defer test2()
    defer test3()
    defer test4()}

运行上述代码,咱们冀望的后果是什么呢?

test 1
test 2
test 3
test 4

还是

test 4
test 3
test 2
test 1

小伙伴们感兴趣的能够运行一下,后果是 第二种,defer 咱们能够了解为是一个入栈操作,先进后出

入栈:test1(),test2(),test3(),test4()

出栈:test4(),test3(),test2(),test1()

案例 2

下面咱们晓得 defer 和 defer 的程序是依照栈的程序来,那么咱们上面来看看 defer 和 return 的程序又是什么样子的?

  • 简略写 一个用于 return 的函数和 用于 defer 的函数
func testDefer() {fmt.Println("testDefer")
}
func testReturn() int {fmt.Println("testReturn")
    return 1
}
func myTest() int {defer testDefer()
    return testReturn()}
func main() {myTest()
}

再来猜想一下上述编码会是如何执行的呢

是这样的吗?

testDefer
testReturn

还是这样的 ?

testReturn
testDefer

后果依然是第二种,通过上述编码咱们能够看进去 defer 前面的语句 是晚执行的,return 前面的语句是先执行的

那么如果是 多个 defer 和 return 放在一起呢?

xdm,咱们触类旁通了,那必定还是 return 先执行,defer 依照栈的程序执行

案例 3

这个案例咱们加上简略的计算,看看成果如何

  • 简略些一下带有计算的 defer
func testDefer(num int)(res int){defer func(){res = num + 3}()

    return num
}

func main(){res := testDefer(5)
    fmt.Println(res)
}

上述编码运行后会是什么成果呢

是 5 吗?是 8 吗?反正必定不是 3 吧

思考一下,依照下面案例 1 的逻辑,后果是 8

老铁,没故障,num 通过 testDefer 函数传值,赋值 为 5,return num 的时候,返回值是 5,再执行 defer 语句,5+3 就是 8

好了,明天就到这里,感兴趣的敌人也能够玩起来

欢送点赞,关注,珍藏

敌人们,你的反对和激励,是我保持分享,提高质量的能源

好了,本次就到这里

技术是凋谢的,咱们的心态,更应是凋谢的。拥抱变动,背阴而生,致力向前行。

我是 阿兵云原生,欢送点赞关注珍藏,下次见~

正文完
 0