[译] 什么是缓存 false sharing 以及如何解决(Golang 示例)
在解释缓存 false sharing 之前,有必要简要介绍一下缓存在 CPU 架构中的工作原理。 CPU 中缓存的最小化单位是缓存行(现在来说,CPU 中常见的缓存行大小为 64 字节)。因此,当 CPU 从内存中读取变量时,它将读取该变量附近的所有变量。图 1 是一个简单的…
[译] Go: 理解 Sync.Pool 的设计
ℹ️本文基于 Go 1.12 和 1.13 版本,并解释了这两个版本之间 sync/pool.go 的演变。 sync 包提供了一个强大且可复用的实例池,以减少 GC 压力。在使用该包之前,我们需要在使用池之前和之后对应用程序进行基准测试。这非常重要,因为如果不了解它内部的工作…
[译] 我是如何在大型代码库上使用 pprof 调查 Go 中的内存泄漏
在今年的大部分时间里,我一直在 Orbs 团队用 Go 语言做可扩展的区块链的基础设施开发,这是令人兴奋的一年。在 2018 年的时候,我们研究我们的区块链该选择哪种语言实现。因为我们知道 Go 拥有一个良好的社区和一个非常棒的工具集,所以我们选择了 Go。 最近几周,我们进入…
[译] golang 官方文档 context
在刚刚过去的 2019 gopher china 大会上 context 概念被多次提起,包括很多框架的源码也大量运用了。看得出来 context 在 golang 的世界中是一个非常重要的知识点,所以有必要对 context 有一个基本的使用和认知。官方文档解释和示例都比较详…
[译] Go中的HTTP请求处理概述
使用 Go 处理 HTTP 请求主要涉及两件事:ServeMuxes 和 Handlers。 ServeMux本质上是一个 HTTP 请求路由器(或多路复用器)。它将传入的请求与预定义的 URL 路径列表进行比较,并在找到匹配时调用路径的关联 handler。 handler …
[译] part 14: golang 字符串
Go 中的字符串值得特别关注,因为与其他语言相比,它们的实现方式不太一样。 Go 中的字符串是一个字节切片。可以通过将内容放在在""内来创建字符串。来看一个简单的例子,我们创建一个字符串并打印它。 上面的程序将会输出Hello World。 Go 中的字符串兼容 Unicode…
[译] part 6: golang 函数
函数是一个执行指定任务的代码块。函数接收输入,对输入执行一些计算并生成输出。 函数声明以func关键字开头,然后是函数名。入参在(和)之间,返回类型在最后。用parametername type语法指定参数名和类型。也可以指定任意数量的参数,如(parameter1 type,…
[译] part 8: golang if else 语句
如果condition为true,介于{}之间的代码块将被执行。 与 C 之类的其他语言不同,即使{}之间只有一个语句,{}也是强制性需要的。 else if和else对于if来说是可选的。 if else的数量不受限制,它们从上到下判断条件是否为真。如果if else或者if…
[译] part 7: golang 包
到目前为止,我们看到的 go 代码只有一个文件,其中有一个 main 函数和其他几个函数。在实际场景中,将所有源代码写入单个文件不是一个好方法。复用和维护这种代码将变得非常艰难,包就是用来解决这些问题的。 包可以使代码更好的复用和可读,也可以使代码解耦,因此使得应用程序很容易维…
[译] part 9: golang 循环语句
循环语句被用来重复执行一块代码。 for是 Go 中唯一的循环语句。 Go 没有while或do while循环,这些循环存在于其他如 C 语言中。 初始化语句只执行一次。初始化循环后,将检查条件。如果条件的计算结果为true,则执行{}内的循环体,然后执行post语句。pos…
[译] part 10: golang switch 语句
switch是一个条件语句,它计算表达式并将其和可能的结果进行匹配,根据匹配执行代码块。它常用来替代多个 if else 子句。 光说不练假把式,让我们从一个简单的例子开始,该例子将手指号作为输入并输出该手指的名称:)。例如 1 是拇指,2 是无名指,依此类推。 在上述程序中,…
[译] part 12: goalng 变参函数
变参函数是一个可以接受参数数量可变的函数。 如果函数的最后一个参数用...T表示,那么该函数最后一个参数可以接受任意数量的T类型的参数。 注意,只允许函数的最后一个参数为可变参数。 append函数可以增加任意数量的参数给切片。变参函数就是用到了切片的这个原理。 以上是appe…
[译] part 11: goalng 数组和切片
这一章我们将学习 Go 语言中的数组和切片。 数组是属于同一类型的元素的集合。例如,整数 5, 8, 9, 79, 76 的集合可以构成数组。Go 中的数组不允许混合不同类型的值,例如包含字符串和整数。 数组的表示为[n] T。n 表示数组中元素的数量,T 表示每个元素的类型。…
[译] part 13: golang 映射 map
map 是 Go 中的内置类型,它将值与键相关联。可以使用相应的键查找该值。 上面的代码创建了一个叫personSalary的 map,它的键的类型为string,值的类型为int。 map 的零值为nil,如果你尝试给空 map 增加元素,运行时将会触发 panic,因此,必…
[译] part 33: golang 头等函数
支持头等函数的语言允许将函数赋值给变量,作为参数传递给其他函数并从其他函数返回。 Go 支持头等函数功能。 在本教程中,我们将讨论头等函数的语法和各种用例。 让我们从一个简单的例子开始,它将一个函数赋给变量。 在上面的程序中的第 8 行,我们为变量a分配了一个函数。 这是将函数…
[译] part 28: golang 的面向对象 -- 多态
Go 中的多态性是在接口的帮助下实现的。正如我们已经讨论过的,接口可以在 Go 中隐式实现。如果类型为接口中声明的所有方法提供定义,则类型实现接口。让我们看看在接口的帮助下如何在 Go 中实现多态性。 任何定义了接口的所有方法的类型都被称为隐式实现了该接口。 一个接口类型的变量…
[译] part 27: golang 的面向对象 -- 组合取代继承
Go 不支持继承,但它支持组合。组合的通用定义是“放在一起”。组合的一个例子是汽车。汽车由车轮,发动机和各种其他部件组成。 Go 中的组合可以通过将一种结构类型嵌入到另一种结构类型中来实现。 博客文章是一个完美的组合示例。每篇博文都有标题,内容和作者信息。这可以使用组合完美地表…
[译] part 26: golang 的面向对象 -- 结构取代类
Go 不是纯粹的面向对象的编程语言。摘自 Go 的常见问题解答,回答了 Go 是否面向对象的问题。 在即将到来的教程中,我们将讨论如何使用 Go 实现面向对象的编程概念。与其他面向对象的语言(如 Java)相比,它们中的一些在实现上有很大不同。 Go 没有提供类,但它提供了结构…
[译] part 34: golang 反射 reflection
反射是 Go 的高级主题之一,我会尽量让它变得简单。 本教程包含以下部分。 我们现在一个一个来讨论这些部分。 反射是为了程序在运行时检查其变量和值并找到其类型。你可能不明白这意味着什么,但没关系。在本教程结束时,您将清楚地了解反射,请跟紧我。 在学习反射时,任何人都会想到的第一…
[译] part 19: golang 接口 2
我们在上一篇文章中讨论的所有示例接口都是使用值接收者实现的。也可以使用指针接收者实现接口。在使用指针接收者实现接口时需要注意一些细微之处。让我们使用以下程序了解一下。 在上面的程序中的第 13 行,Person结构使用值接收者实现了Describer接口。 正如我们之前已经学过…