摘要:
# Go 读取控制台输入 ## 读取整个句子 我们使用 `while` 循环,在 Go 语言中相当于没有任何参数的 `for` 循环,这样就可以让程序一直运行了。在这个例子中,每次输入一个字符串并按下 `enter` 键,我们会通过 `\n` 这个关键字符来区分字符串,如果你想对比刚才输入的字符串, 阅读全文
摘要:
# 34. 反射 反射是 Go 语言的高级主题之一。 分为如下小节。 - 什么是反射? - 为何需要检查变量,确定变量的类型? - reflect 包 - reflect.Type 和 reflect.Value - reflect.Kind - NumField() 和 Field() 方法 - 阅读全文
摘要:
# 35. 读取文件 文件读取是所有编程语言中最常见的操作之一。本教程我们会学习如何使用 Go 读取文件。 本教程分为如下小节。 - 将整个文件读取到内存 - 使用绝对文件路径 - 使用命令行标记来传递文件路径 - 将文件绑定在二进制文件中 - 分块读取文件 - 逐行读取文件 ## 将整个文件读取到 阅读全文
摘要:
# 33. 函数是一等公民(头等函数) 现在简单概括一下本教程讨论的内容: - 什么是头等函数? - 匿名函数 - 用户自定义的函数类型 - 高阶函数 - 把函数作为参数,传递给其它函数 - 在其它函数中返回函数 - 闭包 - 头等函数的实际用途 ## 什么是头等函数? **支持头等函数(First 阅读全文
摘要:
# 32. panic 和 recover ## 什么是 panic? 在 Go 语言中,程序中一般是使用[错误]来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。 但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用 `panic` 来终止程序。当[函数]发生 p 阅读全文
摘要:
# 31. 自定义错误 ## 使用 New 函数创建自定义错误 创建自定义错误最简单的方法是使用 [`errors`]包中的 [`New`]函数。 在使用 New [函数]创建自定义错误之前,我们先来看看 `New` 是如何实现的。如下所示,是 [`errors` 包]中的 `New` 函数的实现。 阅读全文
摘要:
# 30. 错误处理 ## 什么是错误? 错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。 在 Go 中,错误一直是很常见的。错误用内建的 `error` 类型来表示。 就像其他的内建类型(如 `int`、`float64` 阅读全文
摘要:
# 29. Defer ## 什么是 defer? `defer` 语句的用途是:含有 `defer` 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,我们通过一个示例就很容易明白了。 ## 示例 ```go package main import ( "fmt" ) 阅读全文
摘要:
# 28. 多态 Go 通过[接口]来实现多态。我们已经讨论过,在 Go 语言中,我们是隐式地实现接口。一个类型如果定义了接口所声明的全部[方法],那它就实现了该接口。现在我们来看看,利用接口,Go 是如何实现多态的。 ## 使用接口实现多态 一个类型如果定义了接口的所有方法,那它就隐式地实现了该接 阅读全文
摘要:
# 27. 组合取代继承 Go 不支持继承,但它支持组合(Composition)。组合一般定义为“合并在一起”。汽车就是一个关于组合的例子:一辆汽车由车轮、引擎和其他各种部件组合在一起。 ## 通过嵌套结构体进行组合 在 Go 中,通过在结构体内嵌套结构体,可以实现组合。 组合的典型例子就是博客帖 阅读全文
摘要:
# 26. 结构体取代类 ## Go 支持面向对象吗? Go 并不是完全面向对象的编程语言。Go 官网回答了 Go 是否是面向对象语言,摘录如下。 > 可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认 阅读全文
摘要:
# 25. Mutex ## 临界区 在学习 Mutex 之前,我们需要理解并发编程中临界区(Critical Section)的概念。当程序并发地运行时,多个 [Go 协程]不应该同时访问那些修改共享资源的代码。这些修改共享资源的代码称为临界区。例如,假设我们有一段代码,将一个变量 `x` 自增 阅读全文
摘要:
# 24. Select ## 什么是 select? `select` 语句用于在多个发送/接收信道操作中进行选择。`select` 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,`select` 会随机地选取其中之一执行。该语法与 `switch` 类似,所不同的是,这 阅读全文
摘要:
# 23. 缓冲信道和工作池(Buffered Channels and Worker Pools) ## 什么是缓冲信道? 在[上一教程]里,我们讨论的主要是无缓冲信道。我们在[信道]的教程里详细讨论了,无缓冲信道的发送和接收过程是阻塞的。 我们还可以创建一个有缓冲(Buffer)的信道。只在缓冲 阅读全文
摘要:
# 22. 信道(channel) ## 什么是信道? 信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端接收。 ## 信道的声明 所有信道都关联了一个类型。信道只能运输这种类型的数据,而运输其他类型的数据都是非法的。 `chan 阅读全文
摘要:
# 21. Go 协程 ## Go 协程是什么? Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。 ## Go 协程相比于线程的优势 - 相比线程而言 阅读全文
摘要:
# 19. 接口(二) ### 实现接口:指针接受者与值接受者 在接口(一)上的所有示例中,我们都是使用值接受者(Value Receiver)来实现接口的。我们同样可以使用指针接受者(Pointer Receiver)来实现接口。只不过在用指针接受者实现接口时,还有一些细节需要注意。我们通过下面的 阅读全文
摘要:
# 18. 接口(一) ### 什么是接口? 在面向对象的领域里,接口一般这样定义:**接口定义一个对象的行为**。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。 在 Go 语言中,接口就是方法签名(Method Signature)的集合。当一个类型定义了接口 阅读全文
摘要:
# 17. 方法 ### 什么是方法? 方法其实就是一个函数,在 `func` 这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器是可以在方法的内部访问的。 下面就是创建一个方法的语法。 ```go func (t Type) methodName(p 阅读全文
摘要:
# 15. 指针 ### 什么是指针? 指针是一种存储变量内存地址(Memory Address)的变量。 ![image-20190209154549871](/Users/liuqingzheng/Desktop/go系列教程/image-20190209154549871.png) 如上图所示 阅读全文