golang日常开发系列之二--巧用defer

简介: golang日常开发系列之二--巧用defer

我们都知道,在golang中,有一种语言特性跟C++中的RAII特别相似,那就是defer。例如以下两段代码便可实现相同的效果


#include <iostream>
class Defer {
    public:
        Defer() { }
        ~Defer() {
            std::cout << "defer" << std::endl;
        }
};
int main() {
    Defer d;
    return 0
}


import "fmt"
func main() {
 defer func() {
  fmt.Println("defer")
 }()
}


上述两段代码都会在main函数退出时,打印出字符串"defer"


但是golang中的defer和c++中的RAII还是有不同之处的。在c++中,RAII作用于对象的作用域,当离开对象作用域时,便触发RAII的执行,而一个函数中可能包含很多个不同的作用域。


int main() {
    // 循环体内的作用域
    for (size_t i=0; i<10; i++) {
        Defer d; // 打印10次defer
    }
    // 花括号构成的作用域
    {
        Defer d; // 打印1次defer
    }
    return 0
}


而golang中没有作用域的概念,它不同于c++依赖程序员自行管理内存,golang是带GC的自动语言,对象的回收时机是程序员无法精确控制时机的。因此golang中defer只会在当前函数返回前才触发执行。那么有没有办法达到与c++中RAII类似的效果呢?答案是有的,通过创建匿名函数即可。


func printDefer() {
 fmt.Println("defer")
}
func main() {
 for i  := 0; i < 10; i++ {
        func() {
            defer printDefer()
        }()
 }
  func() {
    defer printDefer()
  }()
}



通过上述golang代码便可达到与c++ RAII类似的效果.

相关文章
|
1月前
|
网络协议 Linux Go
分享一个go开发的工具-SNMP Server
分享一个go开发的工具-SNMP Server
65 0
|
8天前
|
中间件 Go
go语言后端开发学习(三)——基于validator包实现接口校验
go语言后端开发学习(三)——基于validator包实现接口校验
|
10天前
|
Go 开发工具 C语言
从零开始使用golang开发
【6月更文挑战第17天】本文介绍 Go 语言安装与配置等操作。包括.下载与安装从[Go官网](https://golang.org/dl/)下载对应平台的安装包,安装时可自定义路径。安装验证,使用 `go version` 检查版本。环境配置和变量设置,包管理等
17 1
|
16天前
|
存储 前端开发 中间件
Go Web 开发 Demo【用户登录、注册、验证】(3)
Go Web 开发 Demo【用户登录、注册、验证】
|
16天前
|
前端开发 数据库连接 Go
Go Web 开发 Demo【用户登录、注册、验证】(1)
Go Web 开发 Demo【用户登录、注册、验证】
|
8天前
|
存储 Go 开发工具
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
|
8天前
|
JSON 算法 Go
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
|
1月前
|
缓存 负载均衡 网络协议
使用Go语言开发高性能服务的深度解析
【5月更文挑战第21天】本文深入探讨了使用Go语言开发高性能服务的技巧,强调了Go的并发性能、内存管理和网络编程优势。关键点包括:1) 利用goroutine和channel进行并发处理,通过goroutine池优化资源;2) 注意内存管理,减少不必要的分配和释放,使用pprof分析;3) 使用非阻塞I/O和连接池提升网络性能,结合HTTP/2和负载均衡技术;4) 通过性能分析、代码优化、缓存和压缩等手段进一步提升服务性能。掌握这些技术能帮助开发者构建更高效稳定的服务。
|
16天前
|
JSON 前端开发 Java
Go Web 开发 Demo【用户登录、注册、验证】(4)
Go Web 开发 Demo【用户登录、注册、验证】
|
16天前
|
Go 数据库
Go Web 开发 Demo【用户登录、注册、验证】(2)
Go Web 开发 Demo【用户登录、注册、验证】