Skip to content

Commit e54f549

Browse files
committed
增加图注释
1 parent 133d997 commit e54f549

27 files changed

+152
-10
lines changed

01.1.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ Go使用[Mercurial][hg]进行版本管理,首先你必须安装了Mercurial,
4040

4141
![](images/1.1.mac.png?raw=true)
4242

43+
图1.1 源码安装之后执行Go命令的图
44+
4345
如果出现Go的Usage信息,那么说明Go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了Go的安装目录。
4446

4547

@@ -74,9 +76,7 @@ Linux系统用户可通过在Terminal中执行命令`uname -a`来查看系统信
7476

7577
访问[下载地址][downlink],32位系统下载go1.0.3.darwin-386.pkg,64位系统下载go1.0.3.darwin-amd64.pkg,双击下载文件,一路默认安装点击下一步,这个时候go已经安装到你的系统中,默认已经在PATH中增加了相应的`~/go/bin`,这个时候打开终端,输入`go`
7678

77-
看到如下图片说明已经安装成功
78-
79-
![](images/1.1.mac.png?raw=true)
79+
看到类似上面源码安装成功的图片说明已经安装成功
8080

8181
如果出现go的Usage信息,那么说明go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了go的安装目录。
8282

@@ -92,7 +92,9 @@ Linux系统用户可通过在Terminal中执行命令`uname -a`来查看系统信
9292

9393
然后执行`go`
9494

95-
看到类似上面mac安装成功的图片说明已经安装成功
95+
![](images/1.1.linux.png?raw=true)
96+
97+
图1.2 Linux系统下安装成功之后执行go显示的信息
9698

9799
如果出现go的Usage信息,那么说明go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了go的安装目录。
98100

01.3.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
![](images/1.3.go.png?raw=true)
88

9+
图1.3 Go命令显示详细的信息
10+
911
这些命令对于我们平时编写的代码非常有用,接下来就让我们了解一些常用的命令。
1012

1113
## go build

01.4.md

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
![](images/1.4.liteide.png?raw=true)
1010

11+
图1.4 LiteIDE主界面
12+
1113
**LiteIDE主要特点:**
1214

1315
* 支持主流操作系统
@@ -100,15 +102,23 @@
100102
这里将介绍Sublime Text 2(以下简称Sublime)+GoSublime+gocode+MarGo的组合,那么为什么选择这个组合呢?
101103

102104
- 自动化提示代码,如下图所示
103-
![](images/1.4.sublime1.png?raw=true)
105+
106+
![](images/1.4.sublime1.png?raw=true)
107+
108+
图1.5 sublime自动化提示界面
104109

105110
- 保存的时候自动格式化代码,让您编写的代码更加美观,符合Go的标准。
106111
- 支持项目管理
107-
![](images/1.4.sublime2.png?raw=true)
112+
113+
![](images/1.4.sublime2.png?raw=true)
114+
115+
图1.6 sublime项目管理界面
116+
108117
- 支持语法高亮
109118
- Sublime Text 2可免费使用,只是保存次数达到一定数量之后就会提示是否购买,点击取消继续用,和正式注册版本没有任何区别。
110119

111-
接下来就开始讲如何安装,下载[Sublime](http://www.sublimetext.com/)
120+
121+
接下来就开始讲如何安装,下载[Sublime](http://www.sublimetext.com/)
112122

113123
根据自己相应的系统下载相应的版本,然后打开Sublime,对于不熟悉Sublime的同学可以先看一下这篇文章[Sublime Text 2 入门及技巧](http://lucifr.com/139225/sublime-text-2-tricks-and-tips/)
114124

@@ -120,6 +130,8 @@
120130

121131
![](images/1.4.sublime3.png?raw=true)
122132

133+
图1.7 sublime包管理
134+
123135
2. 接下来安装gocode和MarGo。
124136
打开终端运行如下代码(需要git)
125137

@@ -134,6 +146,8 @@
134146

135147
![](images/1.4.sublime4.png?raw=true)
136148

149+
图1.8 sublime安装插件界面
150+
137151
这个时候输入GoSublime,按确定就开始安装了。同理应用于SidebarEnhancements和Go Build。
138152

139153
4. 验证是否安装成功,你可以打开Sublime,打开main.go,看看语法是不是高亮了,输入`import`是不是自动化提示了,`import "fmt"`之后,输入`fmt.`是不是自动化提示有函数了。
@@ -146,7 +160,9 @@
146160
## Vim
147161
Vim是从vi发展出来的一个文本编辑器, 代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。
148162

149-
![](images/1.4.vim.png?raw=true)
163+
![](images/1.4.vim.png?raw=true)
164+
165+
图1.9 VIM编辑器自动化提示Go界面
150166

151167
1. 配置vim高亮显示
152168

@@ -190,6 +206,8 @@ Emacs传说中的神器,她不仅仅是一个编辑器,它是一个整合环
190206

191207
![](images/1.4.emacs.png?raw=true)
192208

209+
图1.10 Emacs编辑Go主界面
210+
193211
1. 配置Emacs高亮显示
194212

195213
cp $GOROOT/misc/emacs/* ~/.emacs.d/
@@ -325,6 +343,8 @@ Eclipse也是非常常用的开发利器,以下介绍如何使用Eclipse来编
325343

326344
![](images/1.4.eclipse1.png?raw=true)
327345

346+
图1.11 Eclipse编辑Go的主界面
347+
328348
1. 首先下载并安装好[Eclipse](http://www.eclipse.org/)
329349

330350
2. 下载[goeclipse](https://code.google.com/p/goclipse/)插件
@@ -355,23 +375,34 @@ Eclipse也是非常常用的开发利器,以下介绍如何使用Eclipse来编
355375

356376
![](images/1.4.eclipse2.png?raw=true)
357377

378+
图1.12 设置Go的一些基础信息
379+
380+
358381
(2).配置Gocode(可选,代码补全),设置Gocode路径为之前生成的gocode.exe文件
359382

360383
![](images/1.4.eclipse3.png?raw=true)
361384

385+
图1.13 设置gocode信息
386+
362387
(3).配置GDB(可选,做调试用),设置GDB路径为MingW安装目录下的gdb.exe文件
363388

364389
![](images/1.4.eclipse4.png?raw=true)
390+
391+
图1.14 设置GDB信息
365392

366393
6. 测试是否成功
367394

368395
新建一个go工程,再建立一个hello.go。如下图:
369396

370397
![](images/1.4.eclipse5.png?raw=true)
371398

399+
图1.15 新建项目编辑文件
400+
372401
调试如下(要在console中用输入命令来调试):
373402

374403
![](images/1.4.eclipse6.png?raw=true)
404+
405+
图1.16 调试Go程序
375406

376407

377408
## links

02.2.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,8 @@ Go内置有一个`error`类型,专门用来处理错误信息,Go的`package`
182182

183183
![](images/2.2.basic.png?raw=true)
184184

185+
图2.1 Go数据格式的存储
186+
185187
## 一些技巧
186188

187189
### 分组声明
@@ -277,6 +279,8 @@ Go之所以会那么简洁,是因为它有一些默认的行为:
277279

278280
![](images/2.2.array.png?raw=true)
279281

282+
图2.2 多维数组的映射关系
283+
280284

281285
### slice
282286

@@ -313,6 +317,8 @@ Go之所以会那么简洁,是因为它有一些默认的行为:
313317

314318
![](images/2.2.slice.png?raw=true)
315319

320+
图2.3 slice和array的对应关系图
321+
316322
slice有一些简便的操作
317323

318324
- `slice`的默认开始位置是0,`ar[:n]`等价于`ar[0:n]`
@@ -352,6 +358,8 @@ slice有一些简便的操作
352358

353359
![](images/2.2.slice2.png?raw=true)
354360

361+
图2.4 slice对应数组的信息
362+
355363
对于`slice`有几个有用的内置函数:
356364

357365
- `len` 获取`slice`的长度
@@ -428,6 +436,8 @@ slice有一些简便的操作
428436

429437
![](images/2.2.makenew.png?raw=true)
430438

439+
图2.5 make和new对应底层的内存分配
440+
431441
关于“零值”,所指并非是空值,而是一种“变量未填充前”的默认值,通常为0。
432442
此处罗列 部分类型 的 “零值”
433443

02.3.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -455,6 +455,8 @@ Go程序会自动调用`init()`和`main()`,所以你不需要在任何地方
455455

456456
![](images/2.3.init.png?raw=true)
457457

458+
图2.6 main函数引入包初始化流程图
459+
458460
### import
459461
我们在写Go代码的时候经常用到import这个命令用来导入包文件,而我们经常看到的方式参考如下:
460462

02.4.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@ Go语言中,也和C或者其他语言一样,我们可以声明新的类型
126126

127127
![](images/2.4.student_struct.png?raw=true)
128128

129+
图2.7 Student和Human的方法继承
130+
129131
我们看到Student访问属性age和name的时候,就像访问自己所有用的字段一样,对,匿名字段就是这样,能够实现字段的继承。是不是很酷啊?还有比这个更酷的呢,那就是student还能访问Human这个字段作为字段名。请看下面的代码,是不是更酷了。
130132

131133
mark.Human = Human{"Marcus", 55, 220}

02.5.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
![](images/2.5.rect_func_without_receiver.png?raw=true)
3232

33+
图2.8 方法和struct的关系图
34+
3335
很显然,这样的实现并不优雅,并且从概念上来说"面积"是"形状"的一个属性,它是属于这个特定的形状的,就像长方形的长和宽一样。
3436

3537
基于上面的原因所以就有了`method`的概念,`method`是附属在一个给定的类型上的,他的语法和函数的声明语法几乎一样,只是在`func`后面增加了一个receiver(也就是method所依从的主体)。
@@ -95,6 +97,8 @@ method的语法如下:
9597

9698
![](images/2.5.shapes_func_with_receiver_cp.png?raw=true)
9799

100+
图2.9 不同struct的method不同
101+
98102
在上例,method area() 分别属于Rectangle和Circle, 于是他们的 Receiver 就变成了Rectangle 和 Circle, 或者说,这个area()方法 是由 Rectangle/Circle 发出的。
99103

100104
>值得说明的一点是,图示中method用虚线标出,意思是此处方法的Receiver是以值传递,而非引用传递,是的,Receiver还可以是指针, 两者的差别在于, 指针作为Receiver会对实例对象的内容发生操作,而普通类型作为Receiver仅仅是以副本作为操作对象,并不对原实例对象发生操作。后文对此会有详细论述。

03.1.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
![](images/3.1.web2.png?raw=true)
88

9+
图3.1 用户访问一个Web站点的过程
10+
911
一个Web服务器也被称为HTTP服务器,它通过HTTP协议与客户端通信。这个客户端通常指的是Web浏览器(其实手机端客户端内部也是浏览器实现的)。
1012

1113
Web服务器的工作原理可以简单地归纳为:
@@ -34,6 +36,8 @@ URL(Uniform Resource Locator)是“统一资源定位符”的英文缩写,用
3436

3537
![](images/3.1.dns_hierachy.png?raw=true)
3638

39+
图3.2 DNS工作原理
40+
3741
更详细的DNS解析的过程如下,这个过程有助于我们理解DNS的工作模式
3842

3943
1. 在浏览器中输入www.qq.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
@@ -50,6 +54,8 @@ URL(Uniform Resource Locator)是“统一资源定位符”的英文缩写,用
5054

5155
![](images/3.1.dns_inquery.png?raw=true)
5256

57+
图3.3 DNS解析的整个流程
58+
5359
> 所谓 `递归查询过程` 就是 “查询的递交者” 更替, 而 `迭代查询过程` 则是 “查询的递交者”不变。
5460
>
5561
> 举个例子来说,你想知道某个一起上法律课的女孩的电话,并且你偷偷拍了她的照片,回到寝室告诉一个很仗义的哥们儿,这个哥们儿二话没说,拍着胸脯告诉你,甭急,我替你查(此处完成了一次递归查询,即,问询者的角色更替)。然后他拿着照片问了学院大四学长,学长告诉他,这姑娘是xx系的;然后这哥们儿马不停蹄又问了xx系的办公室主任助理同学,助理同学说是xx系yy班的,然后很仗义的哥们儿去xx系yy班的班长那里取到了该女孩儿电话。(此处完成若干次迭代查询,即,问询者角色不变,但反复更替问询对象)最后,他把号码交到了你手里。完成整个查询过程。
@@ -83,8 +89,12 @@ HTTP协议是无状态的,同一个客户端的这次请求和上次请求是
8389

8490
![](images/3.1.http.png?raw=true)
8591

92+
图3.4 fiddler抓取的GET信息
93+
8694
![](images/3.1.httpPOST.png?raw=true)
8795

96+
图3.5 fiddler抓取的POST信息
97+
8898
**我们可以看到GET请求消息体为空,POST请求带有消息体**
8999

90100
HTTP协议定义了很多与服务器交互的请求方法,最基本的有4种,分别是GET,POST,PUT,DELETE. 一个URL地址用于描述一个网络上的资源,而HTTP中的GET, POST, PUT, DELETE就对应着对这个资源的查,改,增,删4个操作。 我们最常见的就是GET和POST了。GET一般用于获取/查询资源信息,而POST一般用于更新资源信息.
@@ -120,6 +130,7 @@ Response包中的第一行叫做状态行,由HTTP协议版本号, 状态码
120130

121131
![](images/3.1.response.png?raw=true)
122132

133+
图3.6 访问一次网站的全部请求信息
123134

124135
### HTTP协议是无状态的和Connection: keep-alive的区别
125136
无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
@@ -134,6 +145,8 @@ Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同
134145

135146
![](images/3.1.web.png?raw=true)
136147

148+
图3.7 一次请求的request和response
149+
137150
上面这张图我们可以了解到整个的通讯过程,同时细心的读者是否注意到了一点,一个URL请求但是左边栏里面为什么会有那么多的资源请求(这些都是静态文件,go对于静态文件有专门的处理方式)。
138151

139152
这个就是浏览器的一个功能,第一次请求url,服务器端返回的是html页面,然后浏览器开始渲染HTML:当解析到HTML DOM里面的图片连接,css脚本和js脚本的链接,浏览器就会自动发起一个请求静态资源的HTTP请求,获取相对应的静态资源,然后浏览器就会渲染出来,最终将所有资源整合、渲染,完整展现在我们面前的屏幕上。

03.2.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@
4848

4949
![](images/3.2.goweb.png?raw=true)
5050

51+
图3.8 用户访问Web之后服务器端打印的信息
52+
5153
我们看到上面的代码,要编写一个web服务器很简单,只要调用http包的两个函数就可以了。
5254

5355
>如果你以前是PHP程序员,那你也许就会问,我们的nginx、apache服务器不需要吗?Go就是不需要这些,因为他直接就监听tcp端口了,做了nginx做的事情,然后sayhelloName这个其实就是我们写的逻辑函数了,也就是php里面的控制层(controller)函数类似。

03.3.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ Handler:处理请求和生成返回信息的处理逻辑
1919

2020
![](images/3.3.http.png?raw=true)
2121

22+
图3.9 http包执行流程
23+
2224
1. 创建Listen Socket, 监听指定的端口, 等待客户端请求到来。
2325

2426
2. Listen Socket接受客户端的请求, 得到Client Socket, 接下来通过Client Socket与客户端通信。
@@ -41,6 +43,8 @@ Handler:处理请求和生成返回信息的处理逻辑
4143

4244
![](images/3.3.illustrator.png?raw=true)
4345

46+
图3.10 一个http连接处理流程
47+
4448
至此我们的三个问题已经全部得到了解答,你现在对于Go如何让Web跑起来的是否已经基本了解呢?
4549

4650

0 commit comments

Comments
 (0)