• 现代缓存设计-续集

    这是 Benjamin Manes 的讲座文章,他曾在谷歌担任工程师,现在正在 Vector 担任 CTO 职务。 [前一篇文章](http://highscalability.com/blog/2016/1/25/design-of-a-modern-cache.html)描述了 [Caffeine](https://github.com/ben-manes/caffeine) 使用的缓存算法,特别是淘汰算法和并发模型。我们还对淘汰算法进行了改进,并探索了一种新的到期方法。 ## ...

  • 探索 Go 中的错误处理模式

    当你学习一种新的编程语言时,可能会存在一个挫败期,就是当你无法使用更熟悉的语言来表达想法的时候。你很自然的想知道为什么语言要设计成这样,很容易误认为(当表达想法遇到困难时)这是语言设计者的失误。这种推理可能会导致你以一种非惯用的方法使用一种语言。 一个挑战我自己观念的内容是如何在 `Go` 中处理错误。概括如下: * `Go` 中的错误是一个实现了 `error` 接口(实现了 `Error()` 函数)的任意类型。 * 函数返回错和返回其它类型没有区别。使用多返回值将错误和正常区...

  • 120
    Go 中不定长度集合

    如果你在使用像 C# 或 Java 这样的编程语言后来到 go,你发现的第一件事就是没有像 `List` 和 `Dictionary` 这样的传统集合类型。 这真让我困惑了好几个月。 我找到了一个名为 `container/list` 的软件包,并且几乎用它做所有的东西。 我脑后一直有一个声音在唠叨。语言设计者不应该不直接支持对未知长度的集合管理的功能。每个人都在讨论切片是如何在语言中被广泛使用,但我只是在有明确定义的容量或者它们通过函数返回时我才使用切片,这有点不对劲!! 因此,我...

  • 概述 Go 中读取文件的方式

    当我开始学习 Go 时,我很难掌握各种用于读取文件的 API 和技术。我尝试编写支持多核的单词计数程序([KGRZ/KWC](https://github.com/kgrz/kwc)),通过在一个程序中使用多种读取文件方式来展示我初始的困惑。 在今年的 [Advent of Code](http://adventofcode.com/2017) 中,有些问题需要采用不同的方式来读取输入。我最终每种技术都至少使用过一次,现在我将对这些技术的理解写在本文中。我列出的方法是按照我使用的顺序,并不...

  • 为什么 Go 类型系统中没可变性?

    **本文解释了协变、逆变和不变性是什么,以及对 Go 类型系统的影响。特别是解释了为什么在 slices 中不可能有可变性。** 一个 Go 初学者经常问的问题是“为什么我不能把 `[]int` 类型变量传递给函数 `func ([]interface{ })`”?在这篇文章中,我想探讨这个问题及其对 Go 的影响。但是可变性(本文所描述)的概念在其他语言也是有用的。 可变性描述了子类型关系应用在复合类型中使用时发生的情况。在这种情况下,“A是B的子类型”意味着,A类型的实例始终可以...