Goroutine 泄露 - 被遗忘的发送者

介绍 并发编程允许开发人员使用一种以上的路径解决问题,并且通常用于尝试提高性能。并发编程并不意味着多个路径并行执行。这意味着这些路径是乱序执行,而不是顺序执行的。从历史上看,这种类型的编程是使用由标准库或第三方开发人员提供的库来促进的。 在 Go 中,Goroutines 和 channels 等并发特性内置于语言和运行中,以减少或消除对库的需求。这造成了在 Go 中编写并发程序很容易的错觉。 在决定使用并发时必须谨慎,因为如果使用不当,它会带来一些独特的副作用或陷阱。 如果你不小心,这些陷阱会造成复杂性和令人讨厌的错误。 我将在这篇文章中讨论的陷阱与 Goroutine 泄漏有关。 泄露 Goroutines 在内存管理方面,Go 会为你处理许多细节。 Go 编译器使用转义分析来决定值在内存中的位置。 运行时通过使用垃圾收集器来跟踪和管理堆分配。 虽然在你的应用程序中创建内存泄漏并非不可能,但几率大大降低。 一种常见的内存泄漏类型是 Goroutine 泄漏。 如果你启动了一个你希望最终终止但它从未终止的 Goroutine,那么它已经泄漏了。 它在应用程序的整个生命周期内都存在,并且为 Goroutine 分配的任何内存都无法释放。 这是 Never start a goroutine without knowing how it will stop 的建议背后的部分原因。

理解时间戳和时区

工作中经常有小伙伴分不清时间戳和时区,这里总结一下相关概念,并且不使用三方库函数,手动实现时间戳转日期功能。 概念 时区 世界时区的划分以本初子午线为标准,向东12个时区,向西12个时区,子午线所在区为0时区,东十二区和西十二区重合,所以一共是24个时区。 GMT和UTC GMT: 即格林威治时间(Greenwich Mean Time),也是0时区的标准时间。指太阳横穿格林威治子午线(本初子午线)时的时间。但由于地球自转不均匀不规则,导致GMT不精确,现在已经不再作为世界标准时间使用。 UTC: 即协调世界时间(Coordinated Universal Time)。UTC是以原子时秒长为基础,在时刻上尽量接近于GMT的一种时间计量系统。UTC现在作为世界标准时间使用。 所以,UTC与GMT基本上等同,误差不超过0.9秒。 时间戳 UNIX时间戳:是从UTC时间1970年1月1日起到现在的秒数,不考虑闰秒,一天有86400秒,它是和时区无关的,无论在地球上的那个角落,同一时刻,UNIX时间戳都是一样的,计算机的本地时间就是根据 Unix时间戳 + 时区差 转换而来的。 本地时间 本地时间 = UTC + 时区差 时区差:东为正,西为负。在此,把东八区时区差记为 +0800, UTC 是标准时间参照,GMT(格林威治时间)、CST(北京时间)、PST(太平洋时间)等等是具体的时区,兑换如下: GMT: UTC +0 = GMT: GMT +0 CST: UTC +8 = CST: GMT +8 PST: UTC -8 = PST: GMT -8 手动实现时间戳转日期 思路:

Gin 集成 Swagger

概述 Swagger 是一款用于生成 RESTful 风格 API 接口文档的框架。目前被大多数框架数框架支持,笔者认为 Swagger 最大的特点就是可以让代码和文档绑定在一起,在开发接口的同时接口文档也做好了。 这比文档集中管理要方便的多,可维护性大大提升。让小伙伴更有意愿去写接口文档。 了解 Swagger 基本概念,我们开始切入主题:Gin 集成 Swagger。 安装 前提条件:已安装好 Gin 安装 swagger 文档生成命令行工具。 1 $ go get -u github.com/swaggo/swag/cmd/swag 生成文档: 1 $ swag init 安装 gin-swagger 1 2 $ go get -u github.

如何设计订单编号?

最近项目需要设计订单模块,其中首当其冲的就是订单号的设计。本文整理部分订单号设计思路,抛砖引玉。 设计要求 唯一性 订单号不能重复 安全性 外部人员不能通过订单号窥探到订单业务数据,比如:SKU 订单数等。 可读性(可选) 内部人员可以比较直观的看出订单所属商家,品类等信息。 设计思路 数据库自增ID 优点: 由于自增,唯一性条件满足。又因为是主键,查询效率也很高,且支持范围查询。 缺点: 不满足安全性,自增ID可以直接看到订单数量。没有业务字段参与其中,没有可读性。 UUID 优点: 在同一台机器上生产订单号(多台机器可能出现碰撞),满足唯一性条件。 数据无意义,谁也不能猜到业务数据。安全性满足。 缺点: 数据比较长(36位),没有可读性。 在不考虑可读性的情况下,UUID 也还是不错的。各个语言都有成熟的库,使用方便。 SnowFlake(雪花算法) SnowFlake 使用 int64 数字做唯一ID,且 ID 引入时间戳,保持自增性且不重复。 雪花算法结构: 优点:

如何发一个币?

最近对区块链比较感兴趣,了解了一些基本概念。为了更深入研究区块链(币圈),决定试试发个币玩。 这里以币安测试链做演示,主要是免费。如果要在BSC正式链上发布,需要一些BNB手续费,大概100多块钱。 前期准备 metamask 钱包安装 如果是新手小白,需要先安装 metamask 钱包。地址:https://metamask.io/ 。支持 Chrome FireFox等浏览器。 安装完成后,你就拥有自己的地址了,意味着别人可以向你打币。 添加币安测试链 在 metamask 上自定义 RPC, 添加 BSC Testnet。 网络名称:BSC Testnet 新增 RPC URL:https://data-seed-prebsc-1-s1.binance.org:8545/ 链 ID:97 符号(选填):BNB 区块浏览器 URL(选填):https://testnet.bscscan.com 要一个BNB 去币安测试链要 BNB,网址:https://testnet.binance.org/faucet-smart 填上自己 metamask 地址,官网就会给你打一个 BNB。 发币 合约 新建 ERC20.sol 文件,内容如下: