可以认为这是对 Rob Pike 的一篇关于 Go 字符串的博客的解释。以 Go 程序员的思维来写。 在博客文章中,他说没有什么证据可以证明 Go 字符串是以 slices 的方式实现。我猜这不是他的疏忽,但起码可以证明一点,这不是这篇博客的核心。再说,任何想要自己研究的都可以在使用 Go 代码的过程中探索。我就是这样做的。所以在这篇文章中,我尽力解释 Go 字符串实现与 slice 实现的关系。 我要晨读

已有5324人晨读

当我意识到我一直在处理和解决的问题有一个专有名词描述的时候,我总会觉得这事十分有趣。这次出现这种情况的是竞争条件(Race Conditions)。当你处理多个 routine 共享某类资源的时候,不可避免的需要考虑到这个。如果你未曾在你的代码中考虑过这个问题,现在就是一个不错的时候。 我要晨读

已有6177人晨读

我最近在用 Hadoop 和 Spark 为一个我帮助教学的班级工作。PySpark 的确很棒,但是 Hadoop MapReduce 我从来没有真正关注,直到我发现 mrjob。MapReduce 的观念是极为强大的,但是大量的样板文件需要用 Java 编写,甚至是一个简单的 Hadoop 作业,在我看来那是不必要的。 我要晨读

已有5763人晨读

在某个数据需要被多个线程共享访问的时候,会出现读者-写者问题(这里的「问题」是复数形式的,因为读者-写者问题有多个变种)。访问共享数据的线程有两种类型:读者和写者。读者只会读取数据,而写者则是修改它。当写者拥有了访问数据的权限后,其它的线程(不管是读者还是写者)都不能访问这个数据。这种约束的需求在现实中是存在的,比如:当写者不能原子性地修改某个数据(例如数据库)时,在修改完成之前,要读取这个数据的读者要被阻塞,以免读者获取到损坏的数据(脏数据)。对于读者-写者问题的核心,还有很多修订的限制, 我要晨读

已有6276人晨读

在分布式系统中,超时是基本可靠性概念之一。就像这条 tweet 中提到的,它可以缓和分布式系统中不可避免出现的失败所带来的影响 我要晨读

已有8664人晨读

即将发布的 Go 语言 1.11 版本将会给我们带来对 modules(模块)的实验性支持,这是 Go 语言新的一套依赖管理系统。 (译注:很多编程语言中,把 modules 译作「模块」,但由于目前该机制在 Go 语言还没正式发布,因此尚未有非常普及的译法。而类似的 vendor 一词的翻译,大多中文文章都是采取保留英文原文的方式处理,因此本文对 modules 的翻译参考 vendor 的处理:保留英文原文) 我要晨读

已有5701人晨读

考虑到绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。 所以我斗胆以 Redis 为题材,对 Redis 常见问题做一个总结,希望能够弥补大家的知识盲点。 我要晨读

已有5947人晨读

Hello everyone: 过去3个月我们一直在Loom网路上开发专门用于ERC721通证的一款Plasma Cash实现。有鉴于ERC721通证本身是独特不可替代的,因此该实现并不存在通证拆分或合并的问题。 我要晨读

已有5426人晨读

对LevelDB比较了解应该知道其中一块cache实现:LRU Cache是采用双向链表 + HashTable,其中HashTable是为了解决双向链表的查找性能缺陷才引入的。接下来看一下采用golang如何实现LRU Cache。 我要晨读

已有5269人晨读

软件架构 软件架构是在软件的内部,经过综合各种因素的考量、权衡,选择特定的技术,将系统划分成不同的部分并使这些部分相互分工,彼此协作,为用户提供需要的价值。 我要晨读

已有5255人晨读

毕竟,如果我们去除信任另一方将会执行的需要,那么做事情的效率究竟会提高多少呢? 究竟什么是智能合约呢?这难道不是以太坊的范畴吗?这难道不是未来要走的道路吗?你为什么要阻挠进步呢? 在本文中,我将阐述什么是智能合约以及与之相关的工程实践(提示:这不那么简单,很难保证)。 我要晨读

已有4842人晨读

Go 中的 interface 可以静态编译,动态执行,是最让我感到兴奋的一个特性。如果要让我推荐一个 Go 语言的特性给其他的语言,那我一定会推荐 interface。 我要晨读

已有5226人晨读

我们在网上做的工作,大部分其实就是事件,webhooks 已经成为了连接系统的主要方式,不管是用户创建、支付成功、DockerHub 镜像推送或者 Git 仓库上的合并请求,这些都是非常有用并且轻量级的共享信息的方式 我要晨读

已有5462人晨读

CSP模型是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。 CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。 我要晨读

已有4026人晨读

tail 是我们大多数人都熟悉的命令。我假设你也熟悉提供的 -f 选项。如果你不熟悉,知道它会打印出文件的最后几行即可。最近在一个项目上工作,我想知道我需要做什么来实现这个功能。这个想法来自阅读 Feynman 的书: 我要晨读

已有4234人晨读

正如前面的文章提到的,go-micro 是一个可插拔的框架,它连接了许多不同的常用技术。如果你看看插件仓库,你会看到它支持多少插件。 在我们的例子中,我们将使用 NATS 代理插件。 我要晨读

已有4000人晨读

Go 语言的错误处理是基于明确的目的而设计的。你应该从函数中返回所有可能的错误,并且检查/处理这些返回值。和其他语言相比,这一点可能看起来有些繁琐和不人性化,其实并不是这样的。让我们来看看一些基本的例子,然后继续做一些较重要的事情。 我要晨读

已有4263人晨读

按照 Go 语言官方文档所说, unsafe 是关注 Go 程序操作类型安全的包。 像包名暗示的一样,使用它要格外小心; unsafe 可以特别危险,但它也可以特别有效。例如,当处理系统调用时,Go 的结构体必须和 C 的结构体拥有相同的内存结构,这时你可能除了使用 unsafe 以外,别无选择。 我要晨读

已有4115人晨读