Golang语言中包含有一个defer关键字,它可以将在改函数return之前进行执行,它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。
Defer关键字的典型特点是先进行defer定义的函数,后面执行。 这样的结构特点有点类似C++函数内部变量的定义和析构过程。
因此可以如下改写,来通过C++来实现defer关键字的原理:
defer.h文件
#pragma once
typedef void(*funcCB)();
class DeferPri
{
public:
DeferPri(funcCB cb);
~DeferPri();
private:
funcCB m_cb;
};
#define DEFER_VAR_NAME(a,b) a##b //通过字符串连接函数定义不同变量名
#define CONNECT_NME(a,b) DEFER_VAR_NAME(a,b)
#define defer(func) DeferPri CONNECT_NME(DeferPri, __LINE__) = DeferPri([](){func});
defer.cpp文件
#include "defer.h"
DeferPri::DeferPri(funcCB cb)
{
m_cb = cb;
}
DeferPri::~DeferPri()
{
if (m_cb)
{
m_cb();
}
}
Main.cpp文件
#include "defer.h"
#include <iostream>
#include<stdio.h>
int main()
{
defer(std::cout << "1 defer call!" << std::endl;);
std::cout << "2 this is normal cout!" << std::endl;
defer(std::cout << "3 defer call!" << std::endl;);
std::cout << "4 this is normal cout!!" << std::endl;
}
实现效果
2 this is normal cout!
4 this is normal cout!!
3 defer call!
1 defer call!