-
为什么越来越多的互联网大厂开始使用Go语言?
近年来,你是不是发现越来越多的互联网大厂开始使用Go语言了。其中包括腾讯、美团、滴滴、百度、Google、bilibili...还有最初使用Python的字节跳动,甚至已经全面拥向Go了。 国内外首屈一指的公司们,为什么都开始使用Go语言了? 今天马哥教育陪你谈一谈,它到底有什么优势? 说起Go的优势,多半是因为它有一些别人没有的特性,或者优化了别人麻烦的地方。 在了解Go的特点之前,我们先来看看其它几种常见的语言。ps:这里不是说谁好谁坏,毕竟更多是因人而异。 C/…
-
Go语言高并发时append方法偶现错误的解决方法
在实现图片转码的需求时,需要支持最大 500 个图片下载后转换格式; 如果是一个一个下载后转码,耗时太长,需要使用 goroutine 实现 500 个图片并发下载后,并发转码; 但自测过程中发现,会偶现下载后只转换了 499 个图片或更少的情况(全部下载、转码成功的条件下); 然后就开始了打印日志找 bug 的过程。 排查问题 因为并发时使用到了 sync 等待全部协程结束,起初以为是 sync 异步等待出了问题; 打印日志发现,正常执行了 500 次下载,执行完成下载之后,继续执行的转码操作…
-
Go 语言开源项目使用的函数选项模式
01 介绍 在阅读 Go 语言开源项目的源码时,我们可以发现有很多使用 “函数选项模式” 的代码,“函数选项模式” 是 Rob Pike 在 2014 年提出的一种模式,它使用 Go 语言的两大特性,变长参数和闭包,可以使我们代码更优雅。 关于变长参数和闭包的介绍,需要的读者朋友们可以查阅历史文章,本文我们介绍 “函数选项模式” 的相关内容。 02 使用方式 在介绍“函数选项模式”的使用方式之前,我们先阅读以下这段代码。 type User struct { Id int …
-
使用 Asynq 实现 Go 异步任务处理
1. 介绍 Asynq 是一个 Go 库,用于对任务进行排队并与工作人员异步处理它们。 它的工作原理: 客户端将任务放入队列 服务器从队列中拉出任务并为每个任务启动一个工作 goroutine 多个工作人员同时处理任务 仓库链接:https://github.com/hibiken/asynq) # 2. 快速开始 2.1 准备工作 确保已安装并运行了redis redis-server 安装asynq软件包 go get -u github.com/hibiken/asynq 创建项目asy…
-
Go 语言源码级调试器 Delve
01 介绍 Delve 是一个简单、强大和易用的 Go 语言源代码层级的调试器,也是 Go 官方推荐使用的调试器。 02 安装 Delve 安装非常简单,如果读者朋友使用的是 Go 1.16 或更高版本,可以直接使用 go install 安装: go install github.com/go-delve/delve/cmd/dlv@latest 如果读者朋友们使用的是低于 Go 1.16 的版本,可是先下载 Delve 源码,然后使用 go install 安装: git clone h…
-
深度解密Go语言之sync.map
工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garbage out,还不如直接 panic 了。 本文目录如下: 是什么 Go 语言原生 map 并不是线程安全的,对它进行并发读写操作的时候,需要加锁。而 sync.map 则是一种并发安全的 map,在 Go 1.9 引入。 sync.map 是线程安全的,读取,插入,删除也都保持着常数级的时间复杂…
-
玩转 Go 日志框架 zap
本文包括两部分,一部分是源码解读,另一部分是对zap的增强。 由于zap是一个log库,所以从两方面来深入阅读zap的源码,一个是初始化logger的流程,一个是打一条log的流程。 Github地址:github.com/uber-go/zap… 初始化Logger zap的Logger是一般通过一个Config结构体初始化的,首先看下这个结构体有哪些字段 type Config struct { // 日志Level,因为可以动态更改,所以是atomic类型的,毕竟比锁的性能好…
-
浅谈 Go 语言代码注释问题
每隔一段时间,网上总会突然出现一些令人讨厌的帖子,其观点是:不应该为代码写注释,它存在的唯一原因是因为代码本身不足够好。对于这些论点,我完全不能苟同。 烂代码 他们的观点也不完全是错误的。没有人能说自己的代码足够好。代码本身也会慢慢变坏。你知道什么时候代码腐烂得最厉害吗?当你六个月没有碰这些代码的时候! 当回过头再读的时候,你会非常好奇:“这个作者到底是怎么想的?”(于是,使用 Git blame 来查看历史记录,没想到代码竟然是自己写的,因为这是你的代码。) 反对注释者的论点是:需要注释的唯一…
-
详述 Golang 的符号表
ℹ️ 本文基于 Go 1.13。 符号表是由编译器生成和维护的,保存了与程序相关的信息,如函数和全局变量。理解符号表能帮助我们更好地与之交互和利用它。 符号表 Go 编译的所有二进制文件默认内嵌了符号表。我们来举一个例子并研究它。下面是代码: var AppVersion string func main() { fmt.Println(`Version: `+AppVersion) } 可以通过命令 nm 来展示符号表;下面是从 OSX 的结果中提取的部分信息: 00000000011772…
-
Go:符号表是什么?如何使用?
ℹ️ 本文基于 Go 1.13 ,原文及译者信息在文末。 符号表是由编译器生成和维护的,保存了与程序相关的信息,如函数和全局变量。理解符号表能帮助我们更好地与之交互和利用它。 符号表 Go 编译的所有二进制文件默认内嵌了符号表。我们来举一个例子并研究它。下面是代码: var AppVersion string func main() { fmt.Println(`Version: `+AppVersion) } 可以通过命令 nm 来展示符号表;下面是从 OSX 的结果中提取的部分信息: 00…