Go语言 Defer(延迟)

本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。

目录

定义

应用场景

代码示例

改为匿名函数

总结


定义

延迟:关键字,可以用于修饰语句、函数,

确保这条语句可以在当前栈退出的时候执行。

应用场景

1.一般用于做资源清理工作

2.解锁、关闭文件

3.在同一个函数中多次调用defer,执行时类似于栈的机制:先后入后出

代码示例

创建文件读取函数,并设置读取的文件路径为当前路径下的for循环文件。

Defer函数可以保证文件关闭一定会被执行,不管自定义的函数出现异常还是错误。

示例如下:

Go 复制代码
package main

import (
   "fmt"
   "os"
)

func main() {
   filename := "for循环.go"
   readFile(filename)
}

func readFile(filename string) {
   // func Open(name string) (*File, error) {}
   // 1.go语言一般会将错误码作为最后一个参数返回
   // 2.err一般nil代表没有错误,执行成功,非nil表示执行失败

   f1, err := os.Open(filename)
   defer f1.Close()
   if err != nil {
      fmt.Println("os.Open(", filename, ") ==> 打开文件失败,err:", err)
      return
   }

   buf := make([]byte, 1024)
   // func (f *File) Read(b []byte) (n int, err error)
   n, _ := f1.Read(buf)
   fmt.Println("读取文件的实际长度:", n)
   fmt.Println("读取文件的内容:", string(buf))
}

运行结果:

改为匿名函数

匿名函数,没有名字,属于一次性的逻辑类似于lamada表达式。

把defer的处理改为创建匿名函数,同时调用。

在一个方法或者函数中,可以有多个defer语句,

多个defer语句的执行顺序依照后进先出的原则。

示例如下:

Go 复制代码
package main

import (
   "fmt"
   "os"
)

func main() {
   filename := "for循环.go"
   readFile(filename)
}

func readFile(filename string) {
   // func Open(name string) (*File, error) {}
   // 1.go语言一般会将错误码作为最后一个参数返回
   // 2.err一般nil代表没有错误,执行成功,非nil表示执行失败

   f1, err := os.Open(filename)
   // defer f1.Close()
   defer func(a int) {
      fmt.Println("准备关闭文件, code:", a)
      _ = f1.Close()
   }(100) // 创建一个匿名函数,同时调用

   if err != nil {
      fmt.Println("os.Open(", filename, ") ==> 打开文件失败,err:", err)
      return
   }

   defer fmt.Println("倒计时1")
   defer fmt.Println("倒计时2")
   defer fmt.Println("倒计时3")

   buf := make([]byte, 1024)
   // func (f *File) Read(b []byte) (n int, err error)
   n, _ := f1.Read(buf)
   fmt.Println("读取文件的实际长度:", n)
   fmt.Println("读取文件的内容:", string(buf))
}

运行结果:

总结

本文主要内容为Go语言中defer(延迟)介绍及应用文件读取使用defer的示例。

相关推荐
明月_清风8 小时前
加密解密系统完全指南:原理剖析与 Go 实践
后端
方也_arkling8 小时前
【Java-Day08】static / final / 枚举
java·开发语言
风吹夏回8 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei118 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1128 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding8 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋99 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本9 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
xiaoshuaishuai89 小时前
C# 内存管理与资源泄漏
开发语言·c#
lsx2024069 小时前
SVN 检出操作
开发语言