首页 > 其他分享 >Go 快速入门指南 - defer 函数

Go 快速入门指南 - defer 函数

时间:2022-12-22 16:33:52浏览次数:79  
标签:defer file 入门 err func Go main 函数

概述

一个 defer 语句就是一个普通的函数或方法调用。 defer 语句保证了不论是在正常情况下 (return 返回), 还是非正常情况下 (发生错误, 程序终止),函数或方法都能够执行。

主要特性

  • • 一个函数可定义多个 defer 语句

  • • defer 表达式中的变量值在 defer 表达式定义时已经确定

  • • defer 表达式可以修改函数中的命名返回值

主要作用

  • • 简化异常处理 ( 使用 defer + recover),避免异常与控制流混合在一起 (try … catch … finally)

  • • 在 defer 做资源释放和配置重置等收尾工作

语法规则

如果 defer 函数只有一行语句,可以省略 func() { ... } 代码块,否则就需要用 func() { ... } 代码块包起来。

多个 defer 执行顺序

如果一个函数中注册了多个 defer 函数,这些函数会按照 后进先出 的顺序执行 (和  的出栈顺序一致)。也就是最后注册的 defer 函数会第一个执行,而第一个注册的 defer 函数会最后执行。

例子

函数退出前打印字符

package main

func A() {
    defer println("A 函数执行完成")

    println("A 函数开始执行")
}

func B() {
    defer println("B 函数执行完成")

    println("B 函数开始执行")
}

func main() {
    A()
    B()
}

// $ go run main.go
// 输出如下 
/**
  A 函数开始执行
  A 函数执行完成
  B 函数开始执行
  B 函数执行完成
*/

关闭文件句柄

package main

import (
    "fmt"
    "os"
)

func createFile(name string) *os.File {
    file, err := os.Create(name)
    if err != nil {
        panic(err)
    }
    return file
}

func writeFile(file *os.File) {
    n, err := file.WriteString("hello world")
    if err != nil {
        panic(err)
    } else {
        fmt.Printf("成功写入 %d 个字符\n", n)
    }
}

func closeFile(file *os.File) {
    err := file.Close()
    if err != nil {
        panic(err)
    }
}

func main() {
    file := createFile("/tmp/defer_test.txt")
    defer closeFile(file) // 获取到文件句柄后,第一时间注册 defer 函数

    writeFile(file)
}

// $ go run main.go
// 输出如下 
/**
  成功写入 11 个字符
*/

// $ cat /tmp/defer_test.txt
// 输出如下
/**
  hello world
*/

多个 defer 函数

package main

func A() {
    defer println("第 1 个 defer 函数")

    defer func() { // 这里为了演示 func() { ... } 的语法
        defer println("第 2 个 defer 函数")
    }()

    defer println("第 3 个 defer 函数")

    println("A 函数开始执行")
}

func main() {
    A()
}

// $ go run main.go
// 输出如下
/**
  A 函数开始执行
  第 3 个 defer 函数
  第 2 个 defer 函数
  第 1 个 defer 函数
*/

reference

  1. 1. Go 圣经 (https://book.douban.com/subject/27044219)

联系我

公众号

标签:defer,file,入门,err,func,Go,main,函数
From: https://www.cnblogs.com/duanbiaowu/p/16998842.html

相关文章

  • java入门
    JAVAHelloWorld创建一个文件夹存放代码/java/code新建一个java文件文件后缀名为.javahello.java编写代码publicclassHelloWorld{ publicstaticvoidm......
  • django中间件三个了解的方法、 基于django中间件的功能设计、 cookie与session简介、
    目录django中间件三个了解的方法基于django中间件的功能设计cookie与session简介django操作cookiedjango操作cookiedjango操作sessiondjango中间件三个了解的方法1.proc......
  • GOCVHelper图像处理算法库实例整编
       GOCVHelper主要包含图像处理、图像增强和基础文件处理三个部分。由于前两个部分较具有通用性,而且我在不同项目中都进行了反复使用,为了进一步说明类库内容,这里反过来......
  • Go 快速入门指南 - 环境安装
    概述为了节省篇幅,笔者将常用的3种操作系统对应的安装教程汇总到了一起,读者可以直接选择对应内容阅读。Windows环境搭建下载1. 打开Go官网下载地址(https://go.......
  • Go-18 Golang结构体struct详解
    packagemainimport"fmt"//Golang中的结构体详解typenewIntint//自定义类型typemyInt=int//类型别名typezsIntinttypepersonstruct{ namestr......
  • 将GOCVHelper推向opencv——关于thinning函数的探索
      所以第一步就是opencvopencv_contrib联合起来。通过gitee来下载,速度非常快。https://gitee.com/mirrors/opencv_contrib/repository/archive/master.zip 配置......
  • 1分钟入门angular动画效果animations,敲简单滴哟~~☺
     运行代码创建componentnggcanimate-test 然后在app.module.ts做如下引入 分别是下面两行,自行引入import{BrowserAnimationsModule}from'@angular/platform-browse......
  • 升级版本后,报错go: -i flag is deprecated
    环境 goversiongo1.18.6升级go版本后,本地项目起不来 将-i去掉应用,在重启,则正常启动 ......
  • Django增删改查
    增删改查。配置对应路由,函数,视图。报错注意看控制台。添加取到前台传来的参数,后端给予验证。入库编辑,取到当前编辑得id,在后台查到对应数据。重新update删除,取到当前点......
  • OpenCV官方文档(入门篇)
    OpenCV在Windows中安装此处的描述在Windows7SP1上进行了测试。然而,它也应该适用于任何其他相对现代的Windows操作系统。如果您按照以下步骤后遇到错误,请随时通过Open......