摘要: # Go 读取控制台输入 ## 读取整个句子 我们使用 `while` 循环,在 Go 语言中相当于没有任何参数的 `for` 循环,这样就可以让程序一直运行了。在这个例子中,每次输入一个字符串并按下 `enter` 键,我们会通过 `\n` 这个关键字符来区分字符串,如果你想对比刚才输入的字符串, 阅读全文
posted @ 2019-02-23 22:42 不沉之月 阅读(492) 评论(0) 推荐(0)
摘要: # 35. 读取文件 文件读取是所有编程语言中最常见的操作之一。本教程我们会学习如何使用 Go 读取文件。 本教程分为如下小节。 - 将整个文件读取到内存 - 使用绝对文件路径 - 使用命令行标记来传递文件路径 - 将文件绑定在二进制文件中 - 分块读取文件 - 逐行读取文件 ## 将整个文件读取到 阅读全文
posted @ 2019-02-23 22:41 不沉之月 阅读(154) 评论(0) 推荐(0)
摘要: # 34. 反射 反射是 Go 语言的高级主题之一。 分为如下小节。 - 什么是反射? - 为何需要检查变量,确定变量的类型? - reflect 包 - reflect.Type 和 reflect.Value - reflect.Kind - NumField() 和 Field() 方法 - 阅读全文
posted @ 2019-02-23 22:41 不沉之月 阅读(66) 评论(0) 推荐(0)
摘要: # 33. 函数是一等公民(头等函数) 现在简单概括一下本教程讨论的内容: - 什么是头等函数? - 匿名函数 - 用户自定义的函数类型 - 高阶函数 - 把函数作为参数,传递给其它函数 - 在其它函数中返回函数 - 闭包 - 头等函数的实际用途 ## 什么是头等函数? **支持头等函数(First 阅读全文
posted @ 2019-02-23 22:40 不沉之月 阅读(485) 评论(0) 推荐(0)
摘要: # 32. panic 和 recover ## 什么是 panic? 在 Go 语言中,程序中一般是使用[错误]来处理异常情况。对于程序中出现的大部分异常情况,错误就已经够用了。 但在有些情况,当程序发生异常时,无法继续运行。在这种情况下,我们会使用 `panic` 来终止程序。当[函数]发生 p 阅读全文
posted @ 2019-02-23 22:39 不沉之月 阅读(244) 评论(0) 推荐(0)
摘要: # 31. 自定义错误 ## 使用 New 函数创建自定义错误 创建自定义错误最简单的方法是使用 [`errors`]包中的 [`New`]函数。 在使用 New [函数]创建自定义错误之前,我们先来看看 `New` 是如何实现的。如下所示,是 [`errors` 包]中的 `New` 函数的实现。 阅读全文
posted @ 2019-02-23 22:38 不沉之月 阅读(163) 评论(0) 推荐(0)
摘要: # 30. 错误处理 ## 什么是错误? 错误表示程序中出现了异常情况。比如当我们试图打开一个文件时,文件系统里却并没有这个文件。这就是异常情况,它用一个错误来表示。 在 Go 中,错误一直是很常见的。错误用内建的 `error` 类型来表示。 就像其他的内建类型(如 `int`、`float64` 阅读全文
posted @ 2019-02-23 22:37 不沉之月 阅读(154) 评论(0) 推荐(0)
摘要: # 29. Defer ## 什么是 defer? `defer` 语句的用途是:含有 `defer` 语句的函数,会在该函数将要返回之前,调用另一个函数。这个定义可能看起来很复杂,我们通过一个示例就很容易明白了。 ## 示例 ```go package main import ( "fmt" ) 阅读全文
posted @ 2019-02-23 22:35 不沉之月 阅读(371) 评论(0) 推荐(0)
摘要: # 28. 多态 Go 通过[接口]来实现多态。我们已经讨论过,在 Go 语言中,我们是隐式地实现接口。一个类型如果定义了接口所声明的全部[方法],那它就实现了该接口。现在我们来看看,利用接口,Go 是如何实现多态的。 ## 使用接口实现多态 一个类型如果定义了接口的所有方法,那它就隐式地实现了该接 阅读全文
posted @ 2019-02-23 22:35 不沉之月 阅读(90) 评论(0) 推荐(0)
摘要: # 27. 组合取代继承 Go 不支持继承,但它支持组合(Composition)。组合一般定义为“合并在一起”。汽车就是一个关于组合的例子:一辆汽车由车轮、引擎和其他各种部件组合在一起。 ## 通过嵌套结构体进行组合 在 Go 中,通过在结构体内嵌套结构体,可以实现组合。 组合的典型例子就是博客帖 阅读全文
posted @ 2019-02-23 22:34 不沉之月 阅读(340) 评论(0) 推荐(0)
摘要: # 26. 结构体取代类 ## Go 支持面向对象吗? Go 并不是完全面向对象的编程语言。Go 官网回答了 Go 是否是面向对象语言,摘录如下。 > 可以说是,也可以说不是。虽然 Go 有类型和方法,支持面向对象的编程风格,但却没有类型的层次结构。Go 中的“接口”概念提供了一种不同的方法,我们认 阅读全文
posted @ 2019-02-23 22:33 不沉之月 阅读(390) 评论(0) 推荐(0)
摘要: # 25. Mutex ## 临界区 在学习 Mutex 之前,我们需要理解并发编程中临界区(Critical Section)的概念。当程序并发地运行时,多个 [Go 协程]不应该同时访问那些修改共享资源的代码。这些修改共享资源的代码称为临界区。例如,假设我们有一段代码,将一个变量 `x` 自增 阅读全文
posted @ 2019-02-23 22:32 不沉之月 阅读(601) 评论(0) 推荐(0)
摘要: # 24. Select ## 什么是 select? `select` 语句用于在多个发送/接收信道操作中进行选择。`select` 语句会一直阻塞,直到发送/接收操作准备就绪。如果有多个信道操作准备完毕,`select` 会随机地选取其中之一执行。该语法与 `switch` 类似,所不同的是,这 阅读全文
posted @ 2019-02-23 22:31 不沉之月 阅读(208) 评论(0) 推荐(0)
摘要: # 23. 缓冲信道和工作池(Buffered Channels and Worker Pools) ## 什么是缓冲信道? 在[上一教程]里,我们讨论的主要是无缓冲信道。我们在[信道]的教程里详细讨论了,无缓冲信道的发送和接收过程是阻塞的。 我们还可以创建一个有缓冲(Buffer)的信道。只在缓冲 阅读全文
posted @ 2019-02-23 22:30 不沉之月 阅读(87) 评论(0) 推荐(0)
摘要: # 22. 信道(channel) ## 什么是信道? 信道可以想像成 Go 协程之间通信的管道。如同管道中的水会从一端流到另一端,通过使用信道,数据也可以从一端发送,在另一端接收。 ## 信道的声明 所有信道都关联了一个类型。信道只能运输这种类型的数据,而运输其他类型的数据都是非法的。 `chan 阅读全文
posted @ 2019-02-23 22:29 不沉之月 阅读(785) 评论(0) 推荐(0)
摘要: # 21. Go 协程 ## Go 协程是什么? Go 协程是与其他函数或方法一起并发运行的函数或方法。Go 协程可以看作是轻量级线程。与线程相比,创建一个 Go 协程的成本很小。因此在 Go 应用中,常常会看到有数以千计的 Go 协程并发地运行。 ## Go 协程相比于线程的优势 - 相比线程而言 阅读全文
posted @ 2019-02-23 22:28 不沉之月 阅读(240) 评论(0) 推荐(0)
摘要: # 19. 接口(二) ### 实现接口:指针接受者与值接受者 在接口(一)上的所有示例中,我们都是使用值接受者(Value Receiver)来实现接口的。我们同样可以使用指针接受者(Pointer Receiver)来实现接口。只不过在用指针接受者实现接口时,还有一些细节需要注意。我们通过下面的 阅读全文
posted @ 2019-02-23 22:27 不沉之月 阅读(98) 评论(0) 推荐(0)
摘要: # 18. 接口(一) ### 什么是接口? 在面向对象的领域里,接口一般这样定义:**接口定义一个对象的行为**。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。 在 Go 语言中,接口就是方法签名(Method Signature)的集合。当一个类型定义了接口 阅读全文
posted @ 2019-02-23 22:26 不沉之月 阅读(71) 评论(0) 推荐(0)
摘要: # 17. 方法 ### 什么是方法? 方法其实就是一个函数,在 `func` 这个关键字和方法名中间加入了一个特殊的接收器类型。接收器可以是结构体类型或者是非结构体类型。接收器是可以在方法的内部访问的。 下面就是创建一个方法的语法。 ```go func (t Type) methodName(p 阅读全文
posted @ 2019-02-23 22:25 不沉之月 阅读(94) 评论(0) 推荐(0)
摘要: # 15. 指针 ### 什么是指针? 指针是一种存储变量内存地址(Memory Address)的变量。 ![image-20190209154549871](/Users/liuqingzheng/Desktop/go系列教程/image-20190209154549871.png) 如上图所示 阅读全文
posted @ 2019-02-23 22:24 不沉之月 阅读(76) 评论(0) 推荐(0)
摘要: # 16. 结构体 ### 什么是结构体? 结构体是用户定义的类型,表示若干个字段(Field)的集合。有时应该把数据整合在一起,而不是让这些数据没有联系。这种情况下可以使用结构体。 例如,一个职员有 `firstName`、`lastName` 和 `age` 三个属性,而把这些属性组合在一个结构 阅读全文
posted @ 2019-02-23 22:24 不沉之月 阅读(208) 评论(0) 推荐(0)
摘要: # 14. 字符串 ## 什么是字符串? Go 语言中的字符串是一个字节切片。把内容放在双引号""之间,我们可以创建一个字符串。让我们来看一个创建并打印字符串的简单示例。 ```go package main import ( "fmt" ) func main() { name := "Hello 阅读全文
posted @ 2019-02-23 22:23 不沉之月 阅读(106) 评论(0) 推荐(0)
摘要: # 13. Maps ## 什么是 map ? map 是在 Go 中将值(value)与键(key)关联的内置类型。通过相应的键可以获取到值。 ## 如何创建 map ? 通过向 `make` 函数传入键和值的类型,可以创建 map。`make(map[type of key]type of va 阅读全文
posted @ 2019-02-23 22:22 不沉之月 阅读(98) 评论(0) 推荐(0)
摘要: # 12. 可变参数函数 ## 什么是可变参数函数 可变参数函数是一种参数个数可变的函数。 ## 语法 如果函数最后一个参数被记作 `...T` ,这时函数可以接受任意个 `T` 类型参数作为最后一个参数。 请注意只有函数的最后一个参数才允许是可变的。 ## 通过一些例子理解可变参数函数如何工作 你 阅读全文
posted @ 2019-02-23 22:21 不沉之月 阅读(210) 评论(0) 推荐(0)
摘要: # 11. 数组和切片 ## 数组 数组是同一类型元素的集合。例如,整数集合 5,8,9,79,76 形成一个数组。Go 语言中不允许混合不同类型的元素,例如包含字符串和整数的数组。(译者注:当然,如果是 interface{} 类型数组,可以包含任意类型) ### 数组的声明 一个数组的表示形式为 阅读全文
posted @ 2019-02-23 22:19 不沉之月 阅读(413) 评论(0) 推荐(0)
摘要: # 10. switch 语句 switch 是一个条件语句,用于将表达式的值与可能匹配的选项列表进行比较,并根据匹配情况执行相应的代码块。它可以被认为是替代多个 `if else` 子句的常用方式。 看代码比文字更容易理解。让我们从一个简单的例子开始,它将把一个手指的编号作为输入,然后输出该手指对 阅读全文
posted @ 2019-02-23 22:17 不沉之月 阅读(337) 评论(0) 推荐(0)
摘要: # 9. 循环 循环语句是用来重复执行某一段代码。 `for` 是 Go 语言唯一的循环语句。Go 语言中并没有其他语言比如 C 语言中的 `while` 和 `do while` 循环。 ## for 循环语法 ```go for initialisation; condition; post { 阅读全文
posted @ 2019-02-23 22:17 不沉之月 阅读(247) 评论(0) 推荐(0)
摘要: # 8. if-else 语句 if 是条件语句。if 语句的语法是 ```go if condition { } ``` 如果 `condition` 为真,则执行 `{` 和 `}` 之间的代码。 不同于其他语言,例如 C 语言,Go 语言里的 `{ }` 是必要的,即使在 `{ }` 之间只有 阅读全文
posted @ 2019-02-23 22:16 不沉之月 阅读(613) 评论(0) 推荐(0)
摘要: # 7. 包 ### 什么是包,为什么使用包? 到目前为止,我们看到的 Go 程序都只有一个文件,文件里包含一个 main 函数和几个其他的函数。在实际中,这种把所有源代码编写在一个文件的方法并不好用。以这种方式编写,代码的重用和维护都会很困难。而包(Package)解决了这样的问题。 **包用于组 阅读全文
posted @ 2019-02-23 22:15 不沉之月 阅读(80) 评论(0) 推荐(0)
摘要: # 6. 函数(Function) ## 函数是什么? 函数是一块执行特定任务的代码。一个函数是在输入源基础上,通过执行一系列的算法,生成预期的输出。 ## 函数的声明 在 Go 语言中,函数声明通用语法如下: ```go func functionname(parametername type) 阅读全文
posted @ 2019-02-23 22:14 不沉之月 阅读(309) 评论(0) 推荐(0)
摘要: # 4. 类型 下面是 Go 支持的基本类型: - bool - 数字类型 - int8, int16, int32, int64, int - uint8, uint16, uint32, uint64, uint - float32, float64 - complex64, complex12 阅读全文
posted @ 2019-02-23 22:13 不沉之月 阅读(165) 评论(0) 推荐(0)
摘要: # 5. 常量 ### 定义 在 Go 语言中,术语"常量"用于表示固定的值。比如 `5` 、`-89`、 `I love Go`、`67.89` 等等。 看看下面的代码: ```go var a int = 50 var b string = "I love Go" ``` **在上面的代码中,变 阅读全文
posted @ 2019-02-23 22:13 不沉之月 阅读(192) 评论(0) 推荐(0)
摘要: # 3. 变量 ### 变量是什么 变量指定了某存储单元(Memory Location)的名称,该存储单元会存储特定类型的值。在 Go 中,有多种语法用于声明变量。 ### 声明单个变量 **var name type** 是声明单个变量的语法。 ```go package main import 阅读全文
posted @ 2019-02-23 22:12 不沉之月 阅读(98) 评论(0) 推荐(0)
摘要: # 2. Hello World ## 建立 Go 工作区 在编写代码之前,我们首先应该建立 Go 的工作区(Workspace)。 在 **Mac 或 Linux** 操作系统下,Go 工作区应该设置在 **$HOME/go**。所以我们要在 **$HOME** 目录下创建 **go** 目录。 阅读全文
posted @ 2019-02-23 22:11 不沉之月 阅读(220) 评论(0) 推荐(0)
摘要: # 1. 介绍与安装 ## Golang 是什么 Go 亦称为 Golang(按照 Rob Pike 说法,语言叫做 Go,Golang 只是官方网站的网址),是由谷歌开发的一个开源的编译型的静态语言。 Golang 的主要关注点是使得高可用性和可扩展性的 Web 应用的开发变得简便容易。(Go 的 阅读全文
posted @ 2019-02-23 22:10 不沉之月 阅读(118) 评论(0) 推荐(0)
摘要: 第一章:介绍与安装 第二章:Hellow World 第三章:变量 第四章:类型 第五章:常量 第六章:函数(Function) 第七章:包 第八章:if-else语句 第九章:循环 第十章:switch语句 第十一章:数组和切片 第十二章:可变参数函数 第十三章:Maps 第十四章:字符串 第十五 阅读全文
posted @ 2019-02-23 22:07 不沉之月 阅读(131) 评论(0) 推荐(0)
摘要: # 7.flask 源码解析:session ## session 简介 在解析 session 的实现之前,我们先介绍一下 session 怎么使用。session 可以看做是在不同的请求之间保存数据的方法,因为 HTTP 是无状态的协议,但是在业务应用上我们希望知道不同请求是否是同一个人发起的。 阅读全文
posted @ 2019-02-23 21:54 不沉之月 阅读(116) 评论(0) 推荐(0)
摘要: # 6.flask 源码解析:响应 ## response 简介 在 flask 应用中,我们只需要编写 view 函数,并不需要直接和响应(response)打交道,flask 会自动生成响应返回给客户端。 > The return value from a view function is au 阅读全文
posted @ 2019-02-23 21:53 不沉之月 阅读(465) 评论(0) 推荐(0)
摘要: # 5.flask 源码解析:请求 ## 简介 对于物理链路来说,请求只是不同电压信号,它根本不知道也不需要知道请求格式和内容到底是怎样的; 对于 TCP 层来说,请求就是传输的数据(二进制的数据流),它只要发送给对应的应用程序就行了; 对于 HTTP 层的服务器来说,请求必须是符合 HTTP 协议 阅读全文
posted @ 2019-02-23 21:52 不沉之月 阅读(135) 评论(0) 推荐(0)
摘要: # 4.flask 源码解析:上下文 ## 上下文(application context 和 request context) 上下文一直是计算机中难理解的概念,在[知乎的一个问题](https://www.zhihu.com/question/26387327)下面有个很通俗易懂的回答: > 每 阅读全文
posted @ 2019-02-23 21:51 不沉之月 阅读(110) 评论(0) 推荐(0)
摘要: # 3.flask 源码解析:路由 ## 构建路由规则 一个 web 应用不同的路径会有不同的处理函数,**路由就是根据请求的 URL 找到对应处理函数的过程。** 在执行查找之前,需要有一个规则列表,它存储了 url 和处理函数的对应关系。最容易想到的解决方案就是定义一个字典,key 是 url, 阅读全文
posted @ 2019-02-23 21:50 不沉之月 阅读(160) 评论(0) 推荐(0)
摘要: # 2.flask 源码解析:应用启动流程 ## WSGI 所有的 python web 框架都要遵循 WSGI 协议 在这里还是要简单回顾一下 WSGI 的核心概念。 WSGI 中有一个非常重要的概念:每个 python web 应用都是一个可调用(callable)的对象。在 flask 中,这 阅读全文
posted @ 2019-02-23 21:49 不沉之月 阅读(1425) 评论(0) 推荐(0)
摘要: # 1.flask 源码解析:简介 ## flask 简介 Flask 官网上对它的定位是一个“微” python web 开发框架。 > Flask is a micro web development framework for Python. python 语言 web 框架很多:Django 阅读全文
posted @ 2019-02-23 21:48 不沉之月 阅读(247) 评论(0) 推荐(0)