在golang中有个关键字defer,作用其实就是C++中的析构作用,作为释放资源,但是为什么还要实现它呢?
主要就是为了“擦屁股”,避免程序员忘记后续操作。
C++类似思想的包括智能指针,自解锁等
先贴代码,再说用法
class Defer final
{
public:
explicit Defer(std::function<void()> fun) : m_funCall(fun) { }
~Defer() { m_funCall(); }
private:
std::function<void()> m_funCall;
};
这是一个最简单的实现,不用解释都清楚
再看一下用法
std::string readFile(std::string filename)
{
std::ifstream ifile(filename);
Defer def([&ifile](){ ifile.close(); });
std::ostringstream buf;
char ch;
while (buf&&ifile.get(ch))
buf.put(ch);
return buf.str();
}
上面是读文件操作,目的是为了避免用户忘记关闭文件,那么我们只要再打开后加入此操作
Defer def([&ifile](){ ifile.close(); });
由于def是个局部变量,故在函数结束释放时会自动执行析构,析构里即是关闭文件操作。
有了这种“擦屁股”的功能,很多地方都可得到避免