首页 > 其他分享 >Go 100 mistakes - #35: Using defer inside a loop

Go 100 mistakes - #35: Using defer inside a loop

时间:2024-02-21 09:34:33浏览次数:32  
标签:function defer closure inside 35 file each loop

We will implement a function that opens a set of files where the file paths are received via a channel. Hence, we have to iterate over this channel, open the files, and handle the closure. Here’s our first version:

There is a significant problem with this implementation. We have to recall that defer schedules a function call when the surrounding function returns. In this case, the defer calls are executed not during each loop iteration but when the readFiles function returns. If readFiles doesn’t return, the file descriptors will be kept open forever, causing leaks.

 

What are the options to fix this problem? One might be to get rid of defer and handle the file closure manually. But if we did that, we would have to abandon a convenient feature of the Go toolset just because we were in a loop. So, what are the options if we want to keep using defer? We have to create another surrounding function around defer that is called during each iteration.
For example, we can implement a readFile function holding the logic for each new file path received:

 

Another approach could be to make the readFile function a closure:

 

标签:function,defer,closure,inside,35,file,each,loop
From: https://www.cnblogs.com/zhangzhihui/p/18024471

相关文章

  • P2357 守墓人
    原题链接题解标准的线段树加上一点点题意转化,注意细节code#definelllonglong#include<bits/stdc++.h>usingnamespacestd;lltree[810000];llwait[810000];inlinevoidread(ll&x){x=0;llflag=1;charc=getchar();while(c<'0'......
  • P3435
    P3435设\(Q=a[1,i]\),左端绿色虚线终点为j则\(a[1,j]==a[i+1,n]\),因为他们位于Q的相同位置联想到kmp的next数组\(len_Q=n-next[j]\)只要找到最小的且非0的\(next[j]\)就可以最大化\(len_Q\)类似失配时的操作,递归找j对应的最小next......
  • RK3568驱动指南|驱动基础进阶篇-进阶5 自定义实现insmod命令实验
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......
  • 代码随想录算法训练营第二十二天|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树
    二叉搜索树的最近公共祖先 题目链接:235.二叉搜索树的最近公共祖先-力扣(LeetCode)思路:只要利用二叉搜索树特性,只要当前节点的值位于要求的两个节点之间,就必定是我们要找的节点。最简单的一集。classSolution{public:TreeNode*lowestCommonAncestor(TreeNode*root,......
  • 代码随想录算法训练营第二十二天 | 450.删除二叉搜索树中的节点, 701.二叉搜索树中的
     450.删除二叉搜索树中的节点 已解答中等 相关标签相关企业 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。一般来说,删除节点......
  • RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用
    瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和MaliG522EE图形处理器。RK3568支持4K解码和1080P编码,支持SATA/PCIE/USB3.0外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568支持安卓11和linux系统,主要面向......
  • P6354 [COCI2007-2008#3] TAJNA
    题目描述使用一种加密算法。设字符串的长度为nn,则构造一个矩阵,使得r×c=nr×c=n且在r≤cr≤c的情况下使得rr尽量大。然后把给定的明文按照由上到下,从左到右的顺序填充这个r×cr×c的矩阵。得到的密文就是把矩阵按照从左到右,从上到下的顺序输出的字符串。给定你明文,......
  • hdu4135
    这一道题目主要是要帮助我们养成容斥的思维容斥主要是从集合的角度思考问题的,而且等式右边是奇加偶减,还是按照集合的大小从小到大依次考虑的我们这里显然转化成不互质的个数(肯定不能用欧拉函数),于是把\(N\)分解质因数,然后再按照容斥原理考虑先考虑集合大小为\(1\)的情况:即一个质......
  • P1135 奇怪的电梯
    题目背景感谢@yummy提供的一些数据。题目描述呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第ii层楼(1≤i≤N1≤i≤N)上有一个数字KiKi​(0≤Ki≤N0≤Ki​≤N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不......
  • P5350 序列 题解
    题目链接:P5350序列比较不难的可持久化文艺平衡树?有道弱化版:数组操作不过弱化版没有随机数据,很显然ODT会直接被卡,这题数据随机倒是能用ODT做一下,而且码量也比较小,可以自己写写,或者参照我给的弱化版我给了这题部分操作的ODT写法。我们还是来讲最实用的可持久化文艺平衡树......