美文网首页
Golang-defer关键字

Golang-defer关键字

作者: 突击手平头哥 | 来源:发表于2021-08-25 21:24 被阅读0次

defer关键字

defer是Golang中一个非常重要的关键字,主要是用于注册延迟调用,这些调用在return时才会执行,通常用来销毁资源

示例

简单场景

最简单的使用场景

import "fmt"

type handler struct {

}

func (h *handler) close() {
    fmt.Println("close handler")
}
func (h *handler) call() {
    fmt.Println("call function exec")
}

func  main() {
    h := new(handler)
    defer h.close()

    h.call()
}
call function exec
close handler

defer注册的函数是在return返回时才会被调用,主要用于关闭一些资源句柄之类的

多次注册

注册多个调用的场景

package main

import "fmt"

type handler struct {

}

func (h *handler) close1() {
    fmt.Println("close1 handler")
}

func (h *handler) close2() {
    fmt.Println("close2 handler")
}

func (h *handler) call() {
    fmt.Println("call function exec")
}

func  main() {
    h := new(handler)
    defer h.close1()
    defer h.close2()

    h.call()
}
call function exec
close2 handler
close1 handler

defer允许注册多个调用,按先进后出的顺序执行

变量修改

在注册后修改了变量所指向的值的情况

package main

import "fmt"

type handler struct {
    i   int
}

func (h *handler) close() {
    fmt.Println(h.i, "close handler")
}

func  main() {
    h := &handler{i: 1}
    defer h.close()

    h = &handler{i: 2}
}
1 close handler

defer所注册的函数参数会被复制一份保存起来,并不受后续的修改所影响
不过要注意的是这里只是复制了go的指针,指针指向的地址不会变,但是指针指向的地址上的内容是可以修改变动的

闭包

与上面一种场景相似的就是闭包的场景

package main

import "fmt"

type handler struct {
    i   int
}

func (h *handler) close() {
    fmt.Println(h.i, "close handler")
}

func  main() {
    h := &handler{i: 1}
    defer func() {h.close()}()

    h = &handler{i: 2}

}
2 close handler

类似于上面的指针,闭包不会发生改变,但是闭包所引用的值h可以发生改变

异常情况

在调用os.Exitlog.Fatal这些函数直接退出程序时,defer注册的函数不会被执行

相关文章

  • Golang-defer关键字

    defer关键字 defer是Golang中一个非常重要的关键字,主要是用于注册延迟调用,这些调用在return时...

  • Golang-defer

    defer代码块会在函数调用链表中增加一个函数调用,defer函数调用会在函数正常返回,return返回之后,增加...

  • 基础2-对象-关键字

    this和super注意 this关键字 super关键字 instanceof关键字 final关键字 stat...

  • 关键字与用例设计

    一、关键字(Keyword)根据架构的区分可分为以下三层结构: 底层关键字、公共层关键字、特性关键字。 底层关键字...

  • support v4/design/v7依赖的冲突的解决

    关键字:关键字:关键字:Suggestion: add 'tools:replace="android:value...

  • (2)C语言基础,学习笔记(关键字 )

    关键字 关键字 描述

  • 【iOS】swift关键字整理及含义

    以“#”开头关键字 用在模式中的关键字 声明关键字 与语句有关的关键字 表达式和类型关键字 在特定上下文中使用的关键字

  • 5_变量属性

    关键词:C语言的变量属性、auto关键字、 register关键字、 static关键字、extern关键字 1....

  • dart之extends,with,implements

    描述: 继承(关键字 extends); 混入 mixins (关键字 with); 实现(关键字 implem...

  • 《赴今生》目录

    01)关键字:西靳治安所 02)关键字:奇侠马戏团 03)关键字:陈镜增 04)关键字:帅狼 05)关键字:齐太太...

网友评论

      本文标题:Golang-defer关键字

      本文链接:https://www.haomeiwen.com/subject/kobeiltx.html