Skip to content

Commit

Permalink
Merge branch 'master' of github.com:chai2010/advanced-go-programming-…
Browse files Browse the repository at this point in the history
…book
  • Loading branch information
cch123 committed Dec 21, 2018
2 parents b57eb9e + 42ac1c8 commit 22f61f1
Show file tree
Hide file tree
Showing 9 changed files with 22 additions and 4 deletions.
4 changes: 4 additions & 0 deletions ch1-basic/readme.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 第1章 语言基础

*我不知道,你过去10年为什么不快乐。但相信我,抛掉过去的沉重,使用Go语言,体会最初的快乐!——469856321*

*搬砖民工也会建成自己的罗马帝国。——小张*

本章首先简要介绍Go语言的发展历史,并较详细地分析了“Hello World”程序在各个祖先语言中演化过程。然后,对以数组、字符串和切片为代表的基础结构,对以函数、方法和接口所体现的面向过程和鸭子对象的编程,以及Go语言特有的并发编程模型和错误处理哲学做了简单介绍。最后,针对macOS、Windows、Linux几个主流的开发平台,推荐了几个较友好的Go语言编辑器和集成开发环境,因为好的工具可以极大地提高我们的效率。
4 changes: 4 additions & 0 deletions ch2-cgo/readme.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# 第2章 CGO编程

*过去的经验往往是走向未来的枷锁,因为在过气技术中投入的沉没成本会阻碍人们拥抱新技术。——chai2010*

*曾经一度因未能习得C++令人眼花缭乱的新标准而痛苦不已;Go语言“少既是多”大道至简的理念让我重拾信心,寻回了久违的编程乐趣。——Ending*

C/C++经过几十年的发展,已经积累了庞大的软件资产,它们很多久经考验而且性能已经足够优化。Go语言必须能够站在C/C++这个巨人的肩膀之上,有了海量的C/C++软件资产兜底之后,我们才可以放心愉快地用Go语言编程。C语言作为一个通用语言,很多库会选择提供一个C兼容的API,然后用其他不同的编程语言实现。Go语言通过自带的一个叫CGO的工具来支持C语言函数调用,同时我们可以用Go语言导出C动态库接口给其它语言使用。本章主要讨论CGO编程中涉及的一些问题。
4 changes: 4 additions & 0 deletions ch3-asm/readme.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# 第3章 Go汇编语言

*能跑就行,不行加机器。——rfyiamcool & 爱学习的孙老板*

*跟对人,做对事。——Rhichy*

Go语言中很多设计思想和工具都是传承自Plan9操作系统,Go汇编语言也是基于Plan9汇编演化而来。根据Rob Pike的介绍,大神Ken Thompson在1986年为Plan9系统编写的C语言编译器输出的汇编伪代码就是Plan9汇编的前身。所谓的Plan9汇编语言只是便于以手工方式书写该C语言编译器输出的汇编伪代码而已。

无论高级语言如何发展,作为最接近CPU的汇编语言的地位依然是无法彻底被替代的。只有通过汇编语言才能彻底挖掘CPU芯片的全部功能,因此操作系统的引导过程必须要依赖汇编语言的帮助。只有通过汇编语言才能彻底榨干CPU芯片的性能,因此很多底层的加密解密等对性能敏感的算法会考虑通过汇编语言进行性能优化。
Expand Down
2 changes: 2 additions & 0 deletions ch4-rpc/readme.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
# 第4章 RPC和Protobuf

*学习编程,重要的是什么?多练、多看、多实践!跨语言学习,掌握基础语法和语言的特性之后,实战,效率来的最快!——khlipeng*

RPC是远程过程调用的缩写(Remote Procedure Call),通俗地说就是调用远处的一个函数。远处到底有多远呢?可能是同一个文件内的不同函数,也可能是同一个机器的另一个进程的函数,还可能是远在火星好奇号上面的某个秘密方法。因为RPC涉及的函数可能非常之远,远到它们之间说着完全不同的语言,语言就成了两边的沟通障碍。而Protobuf因为支持多种不同的语言(甚至不支持的语言也可以扩展支持),其本身特性也非常方便描述服务的接口(也就是方法列表),因此非常适合作为RPC世界的接口交流语言。本章将讨论RPC的基本用法,如何针对不同场景设计自己的RPC服务,以及围绕Protobuf构造的更为庞大的RPC生态。
2 changes: 1 addition & 1 deletion ch5-web/ch5-02-router.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 5.2 router 请求路由

在常见的Web框架中,router是必备的组件。golang圈子里router也时常被称为http的multiplexer。在上一节中我们通过对Burrow代码的简单学习,已经知道如何用http标准库中内置的mux来完成简单的路由功能了。如果开发Web系统对路径中带参数没什么兴趣的话,用http标准库中的mux就可以。
在常见的Web框架中,router是必备的组件。Go语言圈子里router也时常被称为http的multiplexer。在上一节中我们通过对Burrow代码的简单学习,已经知道如何用http标准库中内置的mux来完成简单的路由功能了。如果开发Web系统对路径中带参数没什么兴趣的话,用http标准库中的mux就可以。

RESTful是几年前刮起的API设计风潮,在RESTful中除了GET和POST之外,还使用了http协议定义的几种其它的标准化语义。具体包括:

Expand Down
2 changes: 1 addition & 1 deletion ch5-web/ch5-03-middleware.md
Original file line number Diff line number Diff line change
Expand Up @@ -257,7 +257,7 @@ func (r *Router) Add(route string, h http.Handler) {

## 5.3.4 哪些事情适合在 middleware 中做

以较流行的开源golang框架chi为例
以较流行的开源Go语言框架chi为例

```
compress.go
Expand Down
4 changes: 2 additions & 2 deletions ch5-web/ch5-04-validator.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ func register(req RegisterReq) error{
}
```

我们在golang里成功写出了hadoken开路的箭头型代码。。这种代码一般怎么进行优化呢?
我们用Go里成功写出了hadoken开路的箭头型代码。。这种代码一般怎么进行优化呢?

很简单,在《重构》一书中已经给出了方案:[Guard Clauses](https://refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html)

Expand Down Expand Up @@ -239,4 +239,4 @@ func main() {

在前一小节中介绍的validator组件在功能上要远比我们这里的demo复杂的多。但原理很简单,就是用reflect对struct进行树形遍历。有心的读者这时候可能会产生一个问题,我们对struct进行validate时大量使用了reflect,而go的reflect在性能上不太出众,有时甚至会影响到我们程序的性能。这样的考虑确实有一些道理,但需要对struct进行大量校验的场景往往出现在Web服务,这里并不一定是程序的性能瓶颈所在,实际的效果还是要从pprof中做更精确的判断。

如果基于反射的validator真的成为了你服务的性能瓶颈怎么办?现在也有一种思路可以避免反射:使用golang内置的parser对源代码进行扫描,然后根据struct的定义生成校验代码。我们可以将所有需要校验的结构体放在单独的package内。这就交给读者自己去探索了。
如果基于反射的validator真的成为了你服务的性能瓶颈怎么办?现在也有一种思路可以避免反射:使用Go内置的parser对源代码进行扫描,然后根据struct的定义生成校验代码。我们可以将所有需要校验的结构体放在单独的package内。这就交给读者自己去探索了。
2 changes: 2 additions & 0 deletions ch5-web/readme.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 第5章 go 和 Web

*不管何种编程语言,适合自己的就是最好的。不管何种编程语言,能稳定实现业务逻辑的就是最好的。世间编程语言千千万,世间程序猿万万千,能做到深入理解并应用的就是最好的。——kenrong*

本章将会阐述 go 在 Web 开发方面的现状,并以几个典型的开源 Web 框架为例,带大家深入 Web 框架本身的执行流程。

同时会介绍现代企业级 Web 开发面临的一些问题,以及在 go 中如何面对,并解决这些问题。
Expand Down
2 changes: 2 additions & 0 deletions ch6-cloud/readme.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# 第6章 分布式系统

*被别人指出问题时,别管别人能不能做到,看别人说的对不对,然后完善自己。别人能不能做到是别人的事情,自己能不能做到关系到自己能否发展的更好。——hustlihaifeng*

Go语言号称是互联网时代的C语言。现在的互联网系统已经不是以前的一个主机搞定一切的时代,互联网时代的后台服务由大量的分布式系统构成,任何单一后台服务器节点的故障并不会导致整个系统的停机。同时以青云、阿里云、腾讯云为代表的云厂商崛起标志着云时代的到来,在云时代分布式编程将成为一个基本技能。而基于Go语言构建的Docker、K8s等系统推动了云时代的提前到来。

对于已经比较完善的分布式系统,我们会简单讲讲怎么通过使用它们来提高我们的工作效率。对于没有现成解决方案的系统,我们会按照自己的业务需求提出解决方案。

0 comments on commit 22f61f1

Please sign in to comment.