聚合国内IT技术精华文章,分享IT技术精华,帮助IT从业人士成长

  • 2980 views阅读

    一个unicode问题

    最近我在处理从 pdf 转换到 docx 的时候,总会出现丢字问题,让我一度以为是字体的原因,结果方正、思源、文泉驿换了个遍也没搞定,最终发现是一个 unicode 问题。 我用 javascript 构造了一个测试用例,你可以在 chrome 控制台里运行它: console.log("网飞" == "⽹⻜") // false 明明两个字符串都是「网飞」,但是却不一样!通常此类问题多...

    分类:技术文章 时间:2022-02-25 17:50 我要评论(0个)

  • 4556 views阅读

    如何用eBPF分析Golang应用

    当医生遇到疑难杂症时,那么可以上 X 光机,有没有病?病在哪里?一照便知!当程序员遇到疑难杂症时,那么多半会查日志,不过日志的位置都是预埋的,可故障的位置却总是随机的,很多时候当我们查到关键的地方时却总是发现没有日志,此时就无能为力了,如果改代码加日志重新发布的话,那么故障往往就不能稳定复现了。回想医生的例子,他们可没有给病人加日志,可为什么他们能找到问题的,因为他们有 X 光机,所以对程...

    分类:技术文章 时间:2021-12-12 13:55 我要评论(0个)

  • 4037 views阅读

    白话Golang单元测试

    最近学习某个 Golang 单元测试的课程,发现其中推荐使用 gomonkey 这种黑科技,让人略感意外,毕竟在软件开发领域,诸如依赖注入之类的概念已经流传了几十年了,本文希望通过一个例子的演化过程,来总结出 Golang 单元测试的最佳实战。 既然是白话,那么我们得想一个通俗易懂的例子,就拿普通人来说吧:活着是为了什么,好好学习,买房,结婚,任意一个环节出现意外,整个人生就会偏离轨道。...

    分类:技术文章 时间:2021-11-28 13:55 我要评论(0个)

  • 3246 views阅读

    一个没什么用的转义技巧

    最近我用命令行工具来测试 rpc 服务,因为此命令行工具要求输入数据是 json 格式,所以免不了要在 shell 环境构造一些 json 字符串: shell> echo '{"content": "$(base64 foo.docx)", "type": "docx"}' 如上,我想把文件 foo.docx 的内容通过 base64 编码,然后放到 json 字符串里,但是它并不...

    分类:技术文章 时间:2021-11-16 17:46 我要评论(0个)

  • 4676 views阅读

    聊一个string和[]byte转换问题

    前几天闲聊的时候,景埕说网上很多 string 和 []byte 的转换都是有问题的,当时并没有在意,转过身没几天我偶然看到字节跳动的一篇文章,其中提到了他们是如何优化 string 和 []byte 转换的,我便问景埕有没有问题,讨论过程中学到了很多,于是便有了这篇总结。 让我们看看问题代码,类似的 string 和 []byte 转换代码在网上非常常见: func StringToS...

    分类:技术文章 时间:2021-10-14 15:25 我要评论(0个)

  • 4584 views阅读

    从一个data race问题学到的

    前几天我在学习内存屏障的时候搜到一篇文章「Golang Memory Model」,其中在介绍 CPU 缓存一致性的时候提到一个例子,带给我一些困惑,本文记录下解惑过程。 既然是在介绍 CPU 缓存一致性的时候举的例子,那么理所应当与此有关,看代码: package main import "time" func main() { running := true go...

    分类:技术文章 时间:2021-10-11 15:25 我要评论(0个)

  • 5002 views阅读

    为什么会有atomic.LoadInt32

    前些天我们聊了 Golang 内存对齐的话题,后来我突然想到另一个问题:为什么会有 atomic.LoadInt32?可能你觉得思维太跳跃了,容我慢慢道来:首先,有 atomic.LoadInt64 很正常,因为对一个 int64 来说,它的大小是 8 个字节,如果是 32 位平台的话(字长 4 字节),CPU 一次最多操作 4 个字节,需要两次才能拿到全部数据,所以封装一个 atomic...

    分类:技术文章 时间:2021-10-08 19:16 我要评论(0个)

  • 5847 views阅读

    再谈Golang内存对齐

    关于 Golang 内存对齐,昨天已经写了一篇「浅谈Golang内存对齐」,可惜对一些细节问题的讨论语焉不详,于是便有了今天这篇「再谈Golang内存对齐」。 让我们回想一下 groupcache 和 sync.WaitGroup 中的做法,为了规避在 32 位环境下 atomic 操作 64 位数的 BUG,它们采取了截然不同的做法: // groupcache type Group...

    分类:技术文章 时间:2021-09-30 19:17 我要评论(0个)

  • 5338 views阅读

    浅谈Golang内存对齐

    如果你在 golang spec 里以「alignment」为关键字搜索的话,那么会发现与此相关的内容并不多,只是在结尾介绍 unsafe 包的时候提了一下,不过别忘了字儿越少事儿越大: Computer architectures may require memory addresses to be aligned; that is, for addresses of a variabl...

    分类:技术文章 时间:2021-09-29 15:25 我要评论(0个)

  • 5249 views阅读

    手把手教你用TARS

    在中国,有一个简单的方法可以用来判断一个互联网公司够不够大,那就是看其是否开源过 rpc 框架!比如阿里巴巴的 dubbo,或者腾讯的 tars,小公司往往会对这些大公司的产品趋之若鹜,不过一个可悲的现实是大公司自己往往并不用他们开源的版本,这就好比皇帝总是把自己看不上眼的女人赏赐给臣民,不过能得到皇帝的赏赐总是好事,下面让我手把手教你用 tars,更具体的说是 tarsgo,也就是 ta...

    分类:技术文章 时间:2021-09-16 16:23 我要评论(0个)

  • 2751 views阅读

    一个select死锁问题

    话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。 让我们搞一段简单的代码来重现一下当时我遇到的问题: package main import "sync" func main() { var wg sync.WaitGroup foo := make(chan int) bar...

    分类:技术文章 时间:2021-08-29 23:46 我要评论(0个)

  • 3097 views阅读

    在docker环境导入私有仓库的问题

    最近我遇到了一个在 docker 环境导入私有仓库的问题:一个 Golang 项目,使用 gitlab ci 来发布,通过 gitlab runner 调用 docker-compose 来打包,但是在构建时失败了。 让我们重回案发现场,看看问题是怎么产生的: 首先是 .gitlab-ci.yml 文件,其相关代码片段内容如下: build_job: stage: build s...

    分类:技术文章 时间:2021-08-24 19:20 我要评论(0个)