Mr.Lee-李健博的博客

22-信道(channel)

Go
什么是信道?信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端接收。 信道的声明所有信道都关联了一个类型。信道只能运输这种类型的数据,而运输其他类型的数据都是非法的。 chan T 表示 T 类型的信道。 信道 ...
详情...

23. 缓冲信道和工作池(Buffered Channels and Worker Pools)

Go
什么是缓冲信道?在[上一教程]里,我们讨论的主要是无缓冲信道。我们在[信道]的教程里详细讨论了,无缓冲信道的发送和接收过程是阻塞的。 我们还可以创建一个有缓冲(Buffer)的信道。只在缓冲已满的情况,才会阻塞向缓冲信道(Buffered Channel)发送数据。同样,只有在缓冲为空的 ...
详情...

24-Select

Go
什么是 select?select 语句用于在多个发送/接收信道操作中进行选择。select 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,select 会随机地选取其中之一执行。该语法与 switch 类似,所不同的是,这里的每个 case 语 ...
详情...

25-Mutex

Go
临界区在学习 Mutex 之前,我们需要理解并发编程中临界区(Critical Section)的概念。当程序并发地运行时,多个 [Go 协程]不应该同时访问那些修改共享资源的代码。这些修改共享资源的代码称为临界区。例如,假设我们有一段代码,将一个变量 x 自增 1。 1x = x + ...
详情...

26-结构体取代类

Go
Go 支持面向对象吗?Go 并不是完全面向对象的编程语言。Go 官网回答了 Go 是否是面向对象语言,摘录如下。 可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认为它易于使用,也更为普遍。 ...
详情...

28-多态

Go
Go 通过[接口]来实现多态。我们已经讨论过,在 Go 语言中,我们是隐式地实现接口。一个类型如果定义了接口所声明的全部[方法],那它就实现了该接口。现在我们来看看,利用接口,Go 是如何实现多态的。 使用接口实现多态一个类型如果定义了接口的所有方法,那它就隐式地实现了该接口。 所有实现了接 ...
详情...

27-组合取代继承

Go
Go 不支持继承,但它支持组合(Composition)。组合一般定义为“合并在一起”。汽车就是一个关于组合的例子:一辆汽车由车轮、引擎和其他各种部件组合在一起。 通过嵌套结构体进行组合在 Go 中,通过在结构体内嵌套结构体,可以实现组合。 组合的典型例子就是博客帖子。每一个博客的帖子都有标 ...
详情...

29-Defer

Go
什么是 defer?defer 语句的用途是:含有 defer 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,我们通过一个示例就很容易明白了。 示例1234567891011121314151617181920212223242526package maini ...
详情...

31-自定义错误

Go
使用 New 函数创建自定义错误创建自定义错误最简单的方法是使用 [errors]包中的 [New]函数。 在使用 New [函数]创建自定义错误之前,我们先来看看 New 是如何实现的。如下所示,是 [errors 包]中的 New 函数的实现。 123456789101112131415 ...
详情...

30-错误处理

Go
什么是错误?错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。 在 Go 中,错误一直是很常见的。错误用内建的 error 类型来表示。 就像其他的内建类型(如 int、float64 等),错误值可以存储在变量里、作 ...
详情...
Prev Next