首页 > 其他分享 >golang中延迟函数调用的知识点

golang中延迟函数调用的知识点

时间:2024-12-20 11:09:56浏览次数:9  
标签:知识点 return 函数 err 文件 nil 函数调用 golang 循环

golang中延迟函数调用的知识点

个较大的延迟调用队列可能会消耗很多内存。 另外,某些资源可能因为某些调用被延迟的太久而未能被及时释放。

比如,如果下面的例子中的函数需要处理大量的文件,则在此函数退出之前,将有大量的文件句柄得不到释放。

func writeManyFiles(files []File) error {
for _, file := range files {
f, err := os.Open(file.path)
if err != nil {
return err
}
defer f.Close()

_, err = f.WriteString(file.content)
if err != nil {
return err
}

err = f.Sync()
if err != nil {
return err
}
}

return nil
}

 

对于这种情形,我们应该使用一个匿名函数将需要及时执行延迟的调用包裹起来。比如,上面的函数可以改进为如下:

func writeManyFiles(files []File) error {
for _, file := range files {
if err := func() error {
f, err := os.Open(file.path)
if err != nil {
return err
}
defer f.Close() // 将在此循环步内执行

_, err = f.WriteString(file.content)
if err != nil {
return err
}

return f.Sync()
}(); err != nil {
return err
}
}

return nil
}

 

writeManyFiles 和 writeManyFiles2 两个函数的主要区别在于错误处理和资源管理的方式。具体来说,writeManyFiles2 函数通过立即返回错误而不是在循环的外部处理错误,减少了函数调用栈的深度,并且在每次循环迭代中都立即关闭文件,这有助于减少文件描述符的占用时间,从而可能提高了效率。下面是两个函数的详细对比:

1,错误处理:

writeManyFiles 函数在循环中遇到错误时会立即返回错误,但是它在循环的外部处理错误,这意味着即使在遇到第一个错误后,循环仍然会继续执行,直到所有文件都被尝试打开和写入。
writeManyFiles2 函数使用了一个匿名函数来封装文件打开、写入和同步的过程,并且在每次循环迭代中,如果遇到错误就会立即返回,这减少了函数调用栈的深度,因为不需要在循环的外部再次检查错误。

2,资源管理:

在 writeManyFiles 函数中,defer f.Close() 语句在循环的外部,这意味着即使在遇到错误后,文件描述符仍然会保持打开状态,直到整个循环完成。这可能会导致文件描述符长时间占用,尤其是在处理大量文件时。
在 writeManyFiles2 函数中,defer f.Close() 语句在匿名函数内部,这意味着每次循环迭代后,如果文件成功写入并且同步,文件描述符会立即关闭。这样可以更快地释放资源,减少资源占用。

3,性能影响:

writeManyFiles 函数可能在处理大量文件时效率较低,因为它在循环外部处理错误,并且在所有文件处理完毕后才关闭文件描述符。
writeManyFiles2 函数通过在每次循环迭代后立即关闭文件描述符,减少了文件描述符的占用时间,这有助于提高性能,尤其是在处理大量文件时。
总的来说,writeManyFiles2 函数通过更有效的错误处理和资源管理,可能提供了更高的执行效率。然而,实际的性能差异还需要根据具体的使用场景和系统环境来确定,因为文件系统的性能、磁盘I/O速度、文件大小等因素都可能影响最终的性能表现。

标签:知识点,return,函数,err,文件,nil,函数调用,golang,循环
From: https://www.cnblogs.com/sunlong88/p/18618922

相关文章

  • java常见知识点
    工作中发现,很多同事,尤其是新同事,对一些基础知识点不熟悉,在此做梳理和总结,便于后期沟通。一、jvm预热https://www.cnblogs.com/crazymakercircle/p/17691632.html为什么要jvm预热?jvm即使编译,动态编译java字节码为优化后的机器码。第一波流量过来,触发即使编译,导致耗时过长,影响可......
  • Golang内存模型与源码解析
    0、引言本篇笔记用于记录作者在学习Golang的GC模型之前,对Golang内存模型的学习。目前使用的Go版本为1.22.41、Golang内存管理宏观结构假设我们每次向内存池申请空间时,都需要频繁地向操作系统发出请求,这不仅会增加内存分配的时间,还可能引入竞争和锁的开销,从而导致性能瓶颈。尤其......
  • 《C++Primer Plus(第6版)中文版》关键知识点笔记汇总(关键框架)
    前言《C++PrimerPluse(第6版)中文版》(后文简称CPPPP)是一部经典的C++入门书籍,作为入门书籍给我的感觉却是劝退,所以我也建议读者在读CPPPP前了解C语言或C++,他的优点也是他的缺点——讲解过细过深,有写地方深入但没有讲透彻让读者晕头转向,在加上翻译问题更是让很多人读不下去,这......
  • golang的互斥锁和读写锁
    golangmutex(互斥锁)1.锁最本质的作用保证原子性2.mutex使用原则适用于并发编程,尽量减少加锁区域的逻辑3.mutex的局限性仅限于单个进程内操作sema(信号量,semaphore的简称)是一种用于并发控制的机制资源计数:信号量维护一个资源计数。这个计数表示当前可用的资源数量获......
  • 【C语言的奥秘11】指针知识点总结(续)
    目录一、指针的运算1、指针与整数相加减2、指针-指针(地址-地址)3、指针的关系运算六、指针和数组七、二级指针八、指针数组一、指针的运算1、指针与整数相加减看一下下面的代码:#include<stdio.h>intmy_strlen(char*str){intcount=0;while(*str!='......
  • javaweb知识点总结
    HTML1.HTML是一种超文本标记语言,可存储文字,图片,视频等等2.HTML依靠浏览器解析运行3.HTML有自己的预定义标签4.HTML由三部分组成,遵循W3C标准结构:HTML表现:CSS行为:JavaScript基础知识:1.颜色标签文字2.HTML文档不区分大小写3.HTMl语法松散#有时语法错误,功能仍正常基础......
  • 前端知识点---字符串的函数
    文章目录1.length2.charAt(index)3.indexOf(searchValue,start)4.lastIndexOf(searchValue,start)5.slice(start,end)6.substring(start,end)7.substr(start,length)8.toUpperCase()和toLowerCase()9.trim()10.split(separator)11.replace(searchValue......
  • 微服务的终极 Golang 框架:GoFr
    微服务的终极Golang框架:GoFr原创 南丞 PFinalClub  2024年12月18日13:18 上海PFinalClub一个有信念者所开发出的力量,大于99个只有兴趣者。113篇原创内容公众号微服务的终极Golang框架:GoFr前言Go语言因其出色的并发处理能力和简洁的语法,成......
  • golang 使用gzip对json例子
    packagemainimport(  "bytes"  "compress/gzip"  "encoding/json"  "fmt"  "io"  "log")//User结构体定义typeUserstruct{  ID int  `json:"id"`  Namestring......
  • C++9--前置++和后置++重载,const,日期类的实现(对前几篇知识点的应用)
    目录1.前置++和后置++重载2.const成员3.日期类的实现1.前置++和后置++重载#include<iostream>usingnamespacestd;classDate{public: Date(intyear=2024,intmonth=1,intday=1) { _year=year; _month=month; _day=day; } //前置++:返......