-
Go语言高并发时append方法偶现错误的解决方法
在实现图片转码的需求时,需要支持最大 500 个图片下载后转换格式; 如果是一个一个下载后转码,耗时太长,需要使用 goroutine 实现 500 个图片并发下载后,并发转码; 但自测过程中发现,会偶现下载后只转换了 499 个图片或更少的情况(全部下载、转码成功的条件下); 然后就开始了打印日志找 bug 的过程。 排查问题 因为并发时使用到了 sync 等待全部协程结束,起初以为是 sync 异步等待出了问题; 打印日志发现,正常执行了 500 次下载,执行完成下载之后,继续执行的转码操作…
-
深度解密Go语言之sync.map
工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garbage out,还不如直接 panic 了。 本文目录如下: 是什么 Go 语言原生 map 并不是线程安全的,对它进行并发读写操作的时候,需要加锁。而 sync.map 则是一种并发安全的 map,在 Go 1.9 引入。 sync.map 是线程安全的,读取,插入,删除也都保持着常数级的时间复杂…
-
浅谈 Go 语言代码注释问题
每隔一段时间,网上总会突然出现一些令人讨厌的帖子,其观点是:不应该为代码写注释,它存在的唯一原因是因为代码本身不足够好。对于这些论点,我完全不能苟同。 烂代码 他们的观点也不完全是错误的。没有人能说自己的代码足够好。代码本身也会慢慢变坏。你知道什么时候代码腐烂得最厉害吗?当你六个月没有碰这些代码的时候! 当回过头再读的时候,你会非常好奇:“这个作者到底是怎么想的?”(于是,使用 Git blame 来查看历史记录,没想到代码竟然是自己写的,因为这是你的代码。) 反对注释者的论点是:需要注释的唯一…
-
详述 Golang 的符号表
ℹ️ 本文基于 Go 1.13。 符号表是由编译器生成和维护的,保存了与程序相关的信息,如函数和全局变量。理解符号表能帮助我们更好地与之交互和利用它。 符号表 Go 编译的所有二进制文件默认内嵌了符号表。我们来举一个例子并研究它。下面是代码: var AppVersion string func main() { fmt.Println(`Version: `+AppVersion) } 可以通过命令 nm 来展示符号表;下面是从 OSX 的结果中提取的部分信息: 00000000011772…
-
Golang 中使用 JSON 时如何区分空字段和未设置字段?
Golang 中使用 JSON 时如何区分空字段和未设置字段?
-
JAVA和GO谁更值得学习?
很多公司也开始转 Go 了,面试官们被迫开始了解 Go。之前没转的时候,他们根本不懂 Go,你说你只懂 Go,那谁能面你呢?不嫌弃才怪呢,毕竟候选人这么多,又不差人。而今年除了面试官的转变,主攻 Go 语言的同学也变多了,Go 和 Java 成为主流。
-
使用Golang开发OpenStack服务的CLI
由于我们需要编写自己服务的客户端,之前参考过magnum的python客户端,编写过一个,整体感受就是: 一件简单的事儿,被他封装的很复杂,而且还有一个关键痛点,部署问题: 1.依赖python环境 2. 蹩脚的二进制打包方式。因此,作为一个产品的CLI,以二进制方式交付会带来诸多方便,比如cloud foundry也用golang重写了他的客户端部分。 Cobra简介 在博客的开篇写过一篇cobra的博客: 如何使用golang编写漂亮的命令行工具, 很多流行的CLI都基于这个库开发,比如ku…
-
找到恶意软件包:Go 语言生态系统中的供应链攻击是怎样的?
近期发生的严重的 SolarWinds 攻击事件和新型 “依赖混淆“攻击,让供应链攻击成为讨论焦点:攻陷供应链中不太安全的元素,导致更安全的目标遭攻陷。 供应链攻击的流行目标一直都是流行编程语言的很多包管理系统,如 NPM (JavaScript)、Rubygems (Ruby) 以及 PyPI (Python)。这些系统常年来遭受恶意攻击,攻击者上传恶意包并等待受害者安装。 目前为止,尚未看到关于 Go 生态系统的供应链攻击情况。鉴于 Go 语言是我的新宠,我决定自己做一些调查。 好在依赖混淆…
-
Go 中如何准确地判断和识别各种网络错误
Go语言集成了简单易用的网路库,今天的推送是一线架构师分享的Go网络库使用入门指南。 Go 自带的网络标准库可能让很多第一次使用它的人感慨,这个库让网络编程的门槛低到了令人发指的地步。然而,封装层次与开发人员的可控性往往是矛盾的。Go 的网络库封装程度算是一个不错的折衷,绝大部分时候,我们只需要调用 Dial, Read, Write Close 几个基本操作就可以了。 但是,网络是复杂的。我们有时候需要细致的处理网络中的各种错误,根据不同的错误进行不同的处理。比如我们遇到一个网络错误时,需要区…
-
使用 Go 实现 TLS socket server
安全传输层协议 TLS,以前称为 SSL(Secure Sockets Layer) ,由于HTTPS的推出受到了很多人的欢迎。但是正如TLS的名称 Transport Layer Security 所示的那样,它实际上是独立于 HTTP,一个更深入的安全协议,我们可以将 TLS 视为 TCP 的安全版本,其提供了对 socket 通信进行加密和签名的功能。在我们的日常开发中,会将 gRPC 协议运行在TLS之上以确保安全。 今天我们来了解一下如何创建一个通过 TLS 加密的 socket 服务…