摘要: 什么是反射 反射就是程序能够在运行时检查变量和值,求出它们的类型。你可能还不太懂,这没关系。在本教程结束后,你就会清楚地理解反射,所以跟着我们的教程学习吧。 为何需要检查变量,确定变量的类型 在学习反射时,所有人首先面临的疑惑就是:如果程序中每个变量都是我们自己定义的,那么在编译时就可以知道变量类型 阅读全文
posted @ 2019-04-07 21:48 Maple_feng 阅读(212) 评论(0) 推荐(0) 编辑
摘要: 什么是头等函数 支持头等函数(First Class Function)的编程语言,可以把函数赋值给变量,也可以把函数作为其它函数的参数或者返回值。Go 语言支持头等函数的机制。 本教程我们会讨论头等函数的语法和用例。 匿名函数 我们来编写一个简单的示例,把函数赋值给一个变量。 在上面的程序中,我们 阅读全文
posted @ 2019-04-07 21:41 Maple_feng 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 什么是 panic 在 Go 语言中,程序中一般是使用[错误]来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。 但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用 panic 来终止程序。当[函数]发生 panic 时,它会终止运行,在执行完所有的[延迟]函数后 阅读全文
posted @ 2019-04-07 21:29 Maple_feng 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 使用 New 函数创建自定义错误 创建自定义错误最简单的方法是使用 [errors]包中的 [New]函数。 在使用 New [函数]创建自定义错误之前,我们先来看看 New 是如何实现的。如下所示,是 [errors 包]中的 New 函数的实现。 New 函数的实现很简单。errorString 阅读全文
posted @ 2019-04-07 21:20 Maple_feng 阅读(1446) 评论(0) 推荐(0) 编辑
摘要: 什么是错误 错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。 在 Go 中,错误一直是很常见的。错误用内建的 error 类型来表示。 就像其他的内建类型(如 int、float64 等),错误值可以存储在变量里、作为函数的 阅读全文
posted @ 2019-04-07 21:15 Maple_feng 阅读(195) 评论(0) 推荐(0) 编辑
摘要: 什么是 defer defer 语句的用途是:含有 defer 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,我们通过一个示例就很容易明白了。 示例 上面的程序很简单,就是找出一个给定切片的最大值。largest 函数接收一个 int 类型的切片作为参数,然后打印出该 阅读全文
posted @ 2019-04-07 21:04 Maple_feng 阅读(136) 评论(0) 推荐(0) 编辑
摘要: Go 通过[接口]来实现多态。我们已经讨论过,在 Go 语言中,我们是隐式地实现接口。一个类型如果定义了接口所声明的全部[方法],那它就实现了该接口。现在我们来看看,利用接口,Go 是如何实现多态的。 使用接口实现多态 一个类型如果定义了接口的所有方法,那它就隐式地实现了该接口。 所有实现了接口的类 阅读全文
posted @ 2019-04-07 20:55 Maple_feng 阅读(4570) 评论(0) 推荐(1) 编辑
摘要: Go 不支持继承,但它支持组合(Composition)。组合一般定义为“合并在一起”。汽车就是一个关于组合的例子:一辆汽车由车轮、引擎和其他各种部件组合在一起。 通过嵌套结构体进行组合 在 Go 中,通过在结构体内嵌套结构体,可以实现组合。 组合的典型例子就是博客帖子。每一个博客的帖子都有标题、内 阅读全文
posted @ 2019-04-07 20:48 Maple_feng 阅读(1506) 评论(0) 推荐(1) 编辑
摘要: Go 支持面向对象吗 Go 并不是完全面向对象的编程语言。Go 官网回答了 Go 是否是面向对象语言,摘录如下。 可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认为它易于使用,也更为普遍。Go 也可以 阅读全文
posted @ 2019-04-07 20:42 Maple_feng 阅读(344) 评论(0) 推荐(0) 编辑
摘要: 临界区 在学习 Mutex 之前,我们需要理解并发编程中临界区(Critical Section)的概念。当程序并发地运行时,多个 [Go 协程]不应该同时访问那些修改共享资源的代码。这些修改共享资源的代码称为临界区。例如,假设我们有一段代码,将一个变量 x 自增 1。 如果只有一个 Go 协程访问 阅读全文
posted @ 2019-04-07 19:01 Maple_feng 阅读(246) 评论(0) 推荐(0) 编辑
摘要: 什么是 select select 语句用于在多个发送/接收信道操作中进行选择。select 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,select 会随机地选取其中之一执行。该语法与 switch 类似,所不同的是,这里的每个 case 语句都是信道操作。我们好好看一 阅读全文
posted @ 2019-04-07 18:54 Maple_feng 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 什么是缓冲信道 在[上一教程]里,我们讨论的主要是无缓冲信道。我们在[信道]的教程里详细讨论了,无缓冲信道的发送和接收过程是阻塞的。 我们还可以创建一个有缓冲(Buffer)的信道。只在缓冲已满的情况,才会阻塞向缓冲信道(Buffered Channel)发送数据。同样,只有在缓冲为空的时候,才会阻 阅读全文
posted @ 2019-04-07 18:34 Maple_feng 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 什么是信道 信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端接收。 信道的声明 所有信道都关联了一个类型。信道只能运输这种类型的数据,而运输其他类型的数据都是非法的。 chan T 表示 T 类型的信道。 信道的零值为 nil。 阅读全文
posted @ 2019-04-07 18:26 Maple_feng 阅读(772) 评论(0) 推荐(0) 编辑
摘要: Go 协程是什么 Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。 Go 协程相比于线程的优势 相比线程而言,Go 协程的成本极低。堆栈大小只有若干 阅读全文
posted @ 2019-04-07 18:07 Maple_feng 阅读(346) 评论(0) 推荐(0) 编辑