[译] part 18: golang 接口 1
面向对象世界中接口的定义是“接口定义对象的行为”。它只指定对象应该做什么。实现此行为(实现细节)的方法取决于对象。 在 Go 的世界里,接口是一组方法签名。当一个类型为接口中的所有方法提供定义时,就说它实现了该接口。它与 OOP 世界非常相似。接口指定类型应具有的方法,类型决定…
[译] part 17: golang 方法 methods
方法是一个具有特殊接收者类型的函数,接收者在func关键字和方法名称之间。接收者可以是struct类型或非struct类型。接收者可用于方法内部的访问。 以下是创建方法的语法。 上面的代码片段创建了一个名为methodName的方法,该方法具有类型为Type的接收者。 让我们编…
[译] part 16: golang 结构体 structures
结构是用户定义的类型,表示字段集合。它可以将一组数据放到结构中,而不是将它们作为单独的类型进行维护。 例如,员工具有firstName,lastName和age。将这三个属性组合成一个结构employee是有意义的。 上面的代码片段声明了一个结构类型Employee,其中包含f…
[译] part 15: golang 指针 pointers
指针是存储另一个变量的内存地址的变量。 在上面的图示中,变量b值为 156 并存储在内存地址 0x1040a124 处。变量a保存了b的地址,那么a就是指针并指向b。 * T是指针变量的类型,它指向类型为T的值。 &运算符用于获取变量的地址。上面程序的第 9 行,我们将b的地址…
[译] part25: golang Mutex 互斥锁
在本教程中,我们将了解互斥锁Mutex。我们还将学习如何使用Mutex和channel解决竞态条件。 在了解互斥锁之前,先了解并发编程中临界区的概念非常重要。当程序并发运行时,多个Goroutines不应该同时拥有修改共享内存的权限。修改共享内存的这部分代码则称为临界区。例如,…
[译] part24: golang select
select语句用于从多个发送/接收channel中进行选择的操作。 select语句将阻塞直到其中一个发送/接收操作准备就绪。如果有多个操作就绪,则随机选择其中一个操作。语法类似于switch,只是每个case语句被一个channel操作取代了。让我们深入研究一些代码,以便更…
[译] part23: golang 缓冲 channel 和协程池
我们在上一个教程中讨论的所有channel基本上都是无缓冲的。正如我们在channel教程中详细讨论的那样,发送和接收到无缓冲的channel都是阻塞的。 可以使用缓冲区创建channel。仅当缓冲区已满时才会阻塞对缓冲channel的发送。类似地,仅当缓冲区为空时才阻塞从缓冲…
[译] part 22: golang channels
在上一个教程中,我们讨论了 Go 中如何使用Goroutines实现并发。在本教程中,我们将讨论有关channel以及Goroutines如何使用channel进行通信。 channel可以被认为是Goroutines通信的管道。类似于水在管道中从一端流到另一端的方式,数据可以…
[译] part 21: golang goroutines
在前面的教程中,我们讨论了并发以及它与并行的不同之处。在本教程中,我们将讨论如何使用Goroutines在 Go 中实现并发性。 Goroutines是与其他函数或方法同时运行的函数或方法。 Goroutines可以被认为是轻量级线程。与线程相比,创建Goroutine的成本很…
[译] part 20: golang 并发介绍
Go 是一种并发语言,而不是并行语言。在讨论如何在 Go 中处理并发之前,我们必须首先了解什么是并发以及它与并行性的不同之处。 并发是指有处理多个事情的能力,用一个例子来解释。 可以比做一个人慢跑。在他早晨慢跑时,发现鞋带已经松了。然后,这个人停止了跑步,绑鞋带,然后又开始跑步…
[译] part 29: golang defer
在存在defer语句的函数返回之前,会执行defer的调用。定义可能看起来有点难懂,但通过示例来理解它非常简单。 以上是一个简单的程序,用于查找给定切片最大的数。largest函数将int切片作为参数,并输出该切片的最大数。largest函数的第一行包含语句defer fini…
[译] Part 31: golang 中的自定义 error
在上一个教程中,我们学习了在 Go 语言中的error是如何表示的以及怎么用标准库处理error。我们还学习了如何从标准库中提取更多的error信息。 本教程介绍如何在我们的函数和包中使用自己定义的error,我们将使用标准库使用的相同技术来提供有关我们的自定义error的更多…
[译] Part 30: golang 中的 error 处理
Error 表示程序中的异常情况。假设我们正在尝试打开文件,文件系统中不存在该文件,那么这是一种异常情况,它就代表一种error。 Go 中使用内置的error类型表示错误。 就像任何其他的内置类型,如 int,float64,... error可以存储在变量中,从函数返回等等…
[译] Part 32: golang 中的 panic 和 recover
处理Go中异常情况的惯用方法是使用errors,对于程序中出现的大多数异常情况,errors就足够了。 但是在某些情况下程序不能在异常情况下继续正常执行。在这种情况下,我们使用panic来终止程序。函数遇到panic时将会停止执行,如果有defer的话就执行defer延迟函数,…