Skip to content

Commit 03bbbf6

Browse files
committed
Merge branch 'dev' into 'master'
#Refactor chapters 4, 5, 6 and change position chapters See merge request zalopay-oss/advanced-go-book!89
2 parents 9ce6142 + d2e5aae commit 03bbbf6

File tree

300 files changed

+4500
-4560
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

300 files changed

+4500
-4560
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.idea
22
.vscode
3-
.txt
3+
.txt
4+
_book

README.md

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@
55
- [Tại sao chúng tôi thực hiện bộ tài liệu này ?](#t%e1%ba%a1i-sao-ch%c3%bang-t%c3%b4i-th%e1%bb%b1c-hi%e1%bb%87n-b%e1%bb%99-t%c3%a0i-li%e1%bb%87u-n%c3%a0y)
66
- [Tài liệu tham khảo](#t%c3%a0i-li%e1%bb%87u-tham-kh%e1%ba%a3o)
77
- [Mục lục](#m%e1%bb%a5c-l%e1%bb%a5c)
8-
- [Xem online](#xem-online)
8+
- [Đọc online](#%c4%90%e1%bb%8dc-online)
99
- [Tham gia phát triển](#tham-gia-ph%c3%a1t-tri%e1%bb%83n)
1010
- [Nhóm phát triển](#nh%c3%b3m-ph%c3%a1t-tri%e1%bb%83n)
1111
- [Liên hệ](#li%c3%aan-h%e1%bb%87)
1212

1313
## Giới thiệu
1414

1515
<div align="center">
16-
<img src="./images/background-book/ver1.0.0.png">
16+
<img src="./images/background-book/ver1.3.0.png">
1717
<br/>
1818
<span align="center">
1919
<i></i>
@@ -34,15 +34,17 @@ Chúng tôi thực hiện bộ tài liệu nhằm:
3434

3535
## Tài liệu tham khảo
3636

37-
Bộ tài liệu này được chúng tôi biên soạn dựa trên kinh nghiệm và kiến thức tích luỹ trong quá trình làm việc tại Zalopay. Đồng thời chúng tôi có tham khảo các tài liệu bên ngoài như [Advanced Go Programming](https://github.com/chai2010/advanced-go-programming-book), [Khoá học Distributed Systems của Princeton](https://www.cs.princeton.edu/courses/archive/fall18/cos418/schedule.html).
37+
Bộ tài liệu này được chúng tôi biên soạn dựa trên kinh nghiệm và kiến thức tích luỹ trong quá trình làm việc tại Zalopay. Đồng thời chúng tôi có tham khảo các tài liệu bên ngoài như:
38+
- [Advanced Go Programming](https://github.com/chai2010/advanced-go-programming-book).
39+
- [Khoá học Distributed Systems của Princeton](https://www.cs.princeton.edu/courses/archive/fall18/cos418/schedule.html).
3840

3941
## Mục lục
4042

4143
Xem mục lục chính của bộ tài liệu [ở đây](./SUMMARY.md).
4244

43-
## Xem online
45+
## Đọc online
4446

45-
- Xem trên [gitbook](https://zalopay-oss.github.io/go-advanced/).
47+
Xem trên [gitbook](https://zalopay-oss.github.io/go-advanced/).
4648

4749
## Tham gia phát triển
4850

@@ -51,8 +53,8 @@ Xem mục lục chính của bộ tài liệu [ở đây](./SUMMARY.md).
5153
Các bạn có thể đóng góp bằng cách:
5254

5355
- [Liên hệ](#li%C3%AAn-h%E1%BB%87) với chúng tôi.
54-
- Trả lời các câu hỏi trong [issues](https://gitlab.zalopay.vn/zalopay-oss/advanced-go-book/issues).
55-
- Tạo các issues gặp phải trên [issues](https://gitlab.zalopay.vn/zalopay-oss/advanced-go-book/issues).
56+
- Trả lời các câu hỏi trong [issues](https://github.com/zalopay-oss/go-advanced/issues).
57+
- Tạo các issues gặp phải trên [issues](https://github.com/zalopay-oss/go-advanced/issues).
5658
- Tạo pull request trên repository của chúng tôi.
5759
- ...
5860

SUMMARY.md

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,51 @@
22

33
* [Giới thiệu](README.md)
44
* [Chương 1: Nền tảng ngôn ngữ Go](ch1-basic/README.md)
5-
* [1.1 Nguồn gốc của ngôn ngữ Go](ch1-basic/ch1-01-genesis.md)
6-
* [1.2 Sự tiến hóa của chương trình "Hello World"](ch1-basic/ch1-02-hello-revolution.md)
7-
* [1.3 Array, strings và slices](ch1-basic/ch1-03-array-string-and-slice.md)
8-
* [1.4 Functions, Methods và Interfaces](ch1-basic/ch1-04-func-method-interface.md)
9-
* [1.5 Điều khiển tuần tự cấu trúc vùng nhớ](ch1-basic/ch1-05-mem.md)
10-
* [1.6 Các chế độ đồng thời thông dụng](ch1-basic/ch1-06-common-concurrency-mode.md)
11-
* [1.7 Error và Exceptions](ch1-basic/ch1-07-error-and-panic.md)
12-
* [1.8 Ghi chú bổ sung](ch1-basic/ch1-08-supplementary-notes.md)
5+
* [1.1 Nguồn gốc của ngôn ngữ Go](ch1-basic/ch1-01-genesis.md)
6+
* [1.2 Sự tiến hóa của chương trình "Hello World"](ch1-basic/ch1-02-hello-revolution.md)
7+
* [1.3 Array, strings và slices](ch1-basic/ch1-03-array-string-and-slice.md)
8+
* [1.4 Functions, Methods và Interfaces](ch1-basic/ch1-04-func-method-interface.md)
9+
* [1.5 Concurrent-oriented memory model](ch1-basic/ch1-05-mem.md)
10+
* [1.6 Concurrency Mode](ch1-basic/ch1-06-common-concurrency-mode.md)
11+
* [1.7 Error và Exceptions](ch1-basic/ch1-07-error-and-panic.md)
12+
* [1.8 Ghi chú bổ sung](ch1-basic/ch1-08-supplementary-notes.md)
1313
* [Chương 2: Lập trình CGO](ch2-cgo/README.md)
14-
* [2.1 Quick Start](ch2-cgo/ch2-01-quick-start.md)
15-
* [2.2 CGO Foundation](ch2-cgo/ch2-02-CGO-foundation.md)
16-
* [2.3 Chuyển đổi kiểu](ch2-cgo/ch2-03-type-conversion.md)
17-
* [2.4 Lời gọi hàm](ch2-cgo/ch2-04-function-call.md)
18-
* [2.5 Cơ chế bên trong CGO](ch2-cgo/ch2-05-internal-mechanisms.md)
19-
* [2.9 Thư viện tĩnh và động](ch2-cgo/ch2-09-static-shared-lib.md)
20-
* [2.10 Biên dịch và liên kết các tham số](ch2-cgo/ch2-10-link.md)
21-
* [2.11 Ghi chú bổ sung](ch2-cgo/ch2-11-ext.md)
22-
* [Chương 3: Go Best Practices](ch3-best-practice/README.md)
23-
* [Chương 4: RPC và Protobuf](ch4-rpc/README.md)
24-
* [4.1 Bắt đầu với RPC](ch4-rpc/ch4-01-rpc-intro.md)
25-
* [4.2 Protobuf](ch4-rpc/ch4-02-pb-intro.md)
26-
* [4.3 RPC trong Golang](ch4-rpc/ch4-03-fun-fpc.md)
27-
* [4.4 Bắt đầu với gRPC](ch4-rpc/ch4-04-grpc.md)
28-
* [4.5 gRPC Nâng cao](ch4-rpc/ch4-05-grpc-advanced.md)
29-
* [4.6 gRPC và Protobuf extensions](ch4-rpc/ch4-06-grpc-ext.md)
30-
* [4.7 pbgo : Protobuf-based framework](ch4-rpc/ch4-07-pbgo.md)
31-
* [4.8 grpcurl tool](ch4-rpc/ch4-08-grpc-curl.md)
32-
* [4.9 Ghi chú bổ sung](ch4-rpc/ch4-09-supplementary-notes.md)
33-
* [Chương 5: Go và Web](ch5-web/README.md)
34-
* [5.1 Giới thiệu về Web Development](ch5-web/ch5-01-introduction.md)
35-
* [5.2 Routing](ch5-web/ch5-02-router.md)
36-
* [5.3 Middleware](ch5-web/ch5-03-middleware.md)
37-
* [5.4 Kiểm tra yêu cầu validator](ch5-web/ch5-04-request-verification.md)
38-
* [5.5 Database và giao tiếp với Database](ch5-web/ch5-05-database.md)
39-
* [5.6 Ratelimit Service Flow Limit](ch5-web/ch5-06-service-flow-limitation.md)
40-
* [5.7 Bố cục thông thường của các dự án web lớn](ch5-web/ch5-07-layout-of-web-project.md)
41-
* [5.8 Interface và Table Driven Development](ch5-web/ch5-08-interface-and-web.md)
42-
* [5.9 Grayscale Publishing and A/B test](ch5-web/ch5-09-gated-launch.md)
43-
* [5.10 Ghi chú bổ sung](ch5-web/ch5-10-ext.md)
44-
* [Chương 6: Hệ thống phân tán](ch6-cloud/README.md)
45-
* [6.1 Distributed id generator](ch6-cloud/ch6-01-dist-id.md)
46-
* [6.2 Distributed lock](ch6-cloud/ch6-02-lock.md)
47-
* [6.3 Hệ thống tác vụ có trì hoãn](ch6-cloud/ch6-03-delay-job.md)
48-
* [6.4 Công cụ tìm kiếm phân tán](ch6-cloud/Ch6-04-search-engine.md)
49-
* [6.5 Cân bằng tải](ch6-cloud/ch6-05-load-balance.md)
50-
* [6.6 Quản lý cấu hình trong hệ thống phân tán](ch6-cloud/ch6-06-config.md)
51-
* [6.7 Trình thu thập thông tin phân tán](ch6-cloud/ch6-07-crawler.md)
52-
* [6.8 Phần mở rộng](ch6-cloud/ch6-08-ext.md)
14+
* [2.1 Quick Start](ch2-cgo/ch2-01-quick-start.md)
15+
* [2.2 CGO Foundation](ch2-cgo/ch2-02-CGO-foundation.md)
16+
* [2.3 Chuyển đổi kiểu](ch2-cgo/ch2-03-type-conversion.md)
17+
* [2.4 Lời gọi hàm](ch2-cgo/ch2-04-function-call.md)
18+
* [2.5 Cơ chế bên trong CGO](ch2-cgo/ch2-05-internal-mechanisms.md)
19+
* [2.9 Thư viện tĩnh và động](ch2-cgo/ch2-09-static-shared-lib.md)
20+
* [2.10 Biên dịch và liên kết các tham số](ch2-cgo/ch2-10-link.md)
21+
* [2.11 Ghi chú bổ sung](ch2-cgo/ch2-11-ext.md)
22+
* [Chương 3: RPC và Protobuf](ch3-rpc/README.md)
23+
* [3.1 Bắt đầu với RPC](ch3-rpc/ch3-01-rpc-intro.md)
24+
* [3.2 Protobuf](ch3-rpc/ch3-02-pb-intro.md)
25+
* [3.3 RPC trong Golang](ch3-rpc/ch3-03-fun-fpc.md)
26+
* [3.4 Bắt đầu với gRPC](ch3-rpc/ch3-04-grpc.md)
27+
* [3.5 gRPC Nâng cao](ch3-rpc/ch3-05-grpc-advanced.md)
28+
* [3.6 gRPC và Protobuf extensions](ch3-rpc/ch3-06-grpc-ext.md)
29+
* [3.7 pbgo : Protobuf-based framework](ch3-rpc/ch3-07-pbgo.md)
30+
* [3.8 grpcurl tool](ch3-rpc/ch3-08-grpc-curl.md)
31+
* [3.9 Ghi chú bổ sung](ch3-rpc/ch3-09-supplementary-notes.md)
32+
* [Chương 4: Go và Web](ch4-web/README.md)
33+
* [4.1 Giới thiệu về Web Development](ch4-web/ch4-01-introduction.md)
34+
* [4.2 Routing](ch4-web/ch4-02-router.md)
35+
* [4.3 Middleware](ch4-web/ch4-03-middleware.md)
36+
* [4.4 Validator request check](ch4-web/ch4-04-request-verification.md)
37+
* [4.5 Database và giao tiếp với Database](ch4-web/ch4-05-database.md)
38+
* [4.6 Ratelimit Service Flow Limit](ch4-web/ch4-06-service-flow-limitation.md)
39+
* [4.7 Bố cục thông thường của các dự án web lớn](ch4-web/ch4-07-layout-of-web-project.md)
40+
* [4.8 Interface và Table Driven Development](ch4-web/ch4-08-interface-and-web.md)
41+
* [4.9 Grayscale Publishing and A/B test](ch4-web/ch4-09-gated-launch.md)
42+
* [4.10 Ghi chú bổ sung](ch4-web/ch4-10-ext.md)
43+
* [Chương 5: Hệ thống phân tán](ch5-cloud/README.md)
44+
* [5.1 Distributed id generator](ch5-cloud/ch5-01-dist-id.md)
45+
* [5.2 Distributed lock](ch5-cloud/ch5-02-lock.md)
46+
* [5.3 Hệ thống tác vụ có trì hoãn](ch5-cloud/ch5-03-delay-job.md)
47+
* [5.4 Công cụ tìm kiếm phân tán](ch5-cloud/Ch5-04-search-engine.md)
48+
* [5.5 Cân bằng tải](ch5-cloud/ch5-05-load-balance.md)
49+
* [5.6 Quản lý cấu hình trong hệ thống phân tán](ch5-cloud/ch5-06-config.md)
50+
* [5.7 Trình thu thập thông tin phân tán](ch5-cloud/ch5-07-crawler.md)
51+
* [5.8 Phần mở rộng](ch5-cloud/ch5-08-ext.md)
52+
* [Chương 6: Go Best Practices](ch6-best-practice/README.md)

ch1-basic/ch1-01-genesis.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ Vào giữa năm 2008, hầu hết các tính năng được thiết kế trong
77
Ngôn ngữ Go thường được mô tả là "Ngôn ngữ tựa C" hoặc là "Ngôn ngữ C của thế kỉ 21". Từ nhiều khía cạnh, ngôn ngữ Go thừa hưởng những ý tưởng từ ngôn ngữ C, như là cú pháp, cấu trúc điều khiển, kiểu dữ liệu cơ bản, thủ tục gọi, trả về, con trỏ, v,v.., hoàn toàn kế thừa và phát triển ngôn ngữ C, hình bên dưới mô tả sự liên quan của ngôn ngữ Go với các ngôn ngữ khác.
88

99
<div align="center">
10-
<img src="../images/ch1-1-go-family-tree.png" width="600">
10+
<img src="../images/ch1-1-go-family-tree.png" width="500">
1111
<br/>
1212
<span align="center">
1313
<i>Cây phả hệ của ngôn ngữ Go</i>
@@ -51,7 +51,7 @@ Hình dưới chỉ ra lịch sử phát triển của ngôn ngữ Go qua codeba
5151
Có thể nhìn thấy từ những submission log rằng ngôn ngữ Go được dần phát triển từ ngôn ngữ B - được phát minh bởi **Ken Thompson** và ngôn ngữ C được phát triển bởi **Dennis M.Ritchie**. Đó là thế hệ ngôn ngữ C đầu tiên, do đó nhiều người gọi Go là ngôn ngữ lập trình C của thế kỉ 21.
5252

5353
<div align="center">
54-
<img src="../images/ch1-3-go-history.png" width="600">
54+
<img src="../images/ch1-3-go-history.png" width="500">
5555
<br/>
5656
<span align="center">
5757
<i>Lịch sử phát triển của lập trình concurrency trong Go</i>
@@ -63,7 +63,7 @@ Trong vòng những năm gần đây, Go là một ngôn ngữ được ưa chu
6363

6464
## 1.1.2. Hello World
6565

66-
Việc đầu tiên là cài đặt chương trình Go lang theo hướng dẫn trên trang chủ [golang.org](https://golang.org/)
66+
Việc đầu tiên là cài đặt chương trình Go lang theo hướng dẫn trên trang chủ [golang.org](https://golang.org/).
6767

6868
Để bắt đầu, chương trình đầu tiên thường in ra dòng chữ "Hello World", đoạn code bên dưới là chương trình này.
6969

ch1-basic/ch1-02-hello-revolution.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ main()
5050
}
5151
```
5252

53-
Ví dụ này cũng xuất hiện trong bản đầu tiên của **_C Programming Language_** xuất bản năm 1978 bởi Brian W. Kerninghan và Dennis M. Ritchie (K&R)
53+
Ví dụ này cũng xuất hiện trong bản đầu tiên của **_C Programming Language_** xuất bản năm 1978 bởi Brian W. Kerninghan và Dennis M. Ritchie (K&R).
5454

5555
Năm 1988, 10 năm sau khi giới thiệu hướng dẫn của K&R, phiên bản thứ 2 của **_C Programming Language_** cuối cùng cũng được xuất bản. Thời điểm này, việc chuẩn hóa ngôn ngữ ANSI C đã được hoàn thành sơ bộ, nhưng phiên bản chính thức của document vẫn chưa được công bố.
5656

ch1-basic/ch1-03-array-string-and-slice.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ var unknown2 = [...]interface{}{123, "Hello!"}
129129
var chanList = [2]chan int{}
130130
```
131131

132-
Chúng ta cũng có thể định nghĩa một array rỗng
132+
Chúng ta cũng có thể định nghĩa một array rỗng.
133133

134134
```go
135135
// Định nghĩa một array chiều dài 0
@@ -149,7 +149,7 @@ Một array có chiều dài 0 thì không chiếm không gian lưu trữ.
149149
</div>
150150
<br/>
151151

152-
`string` cũng là một array của các `byte` dữ liệu, nhưng khác với array những phần tử của string là [immutable](https://en.wikipedia.org/wiki/Immutable_object)
152+
`string` cũng là một array của các `byte` dữ liệu, nhưng khác với array những phần tử của string là [immutable](https://en.wikipedia.org/wiki/Immutable_object).
153153

154154
Cấu trúc [reflect.StringHeader](https://golang.org/src/reflect/value.go?s=56526:56578#L1873) được dùng để biểu diễn string :
155155

@@ -206,7 +206,7 @@ fmt.Println("len(s): ", (*reflect.StringHeader)(unsafe.Pointer(&s)).Len)
206206
## 1.3.3. Slice
207207

208208
<div align="center">
209-
<img src="../images/1-3-golang-slices-length-capacity.jpg"width="600">
209+
<img src="../images/1-3-golang-slices-length-capacity.jpg"width="500">
210210
<br/>
211211
<span align="center">
212212
<i>Slice</i>

ch1-basic/ch1-05-mem.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 1.5. Concurrent-oriented memory model
1+
# 1.5. Mô hình thực thi tuần tự
22

33
Thời gian đầu, CPU chỉ có một lõi duy nhất, các ngôn ngữ khi đó sẽ theo mô hình lập trình tuần tự, điển hình là ngôn ngữ C. Ngày nay, với sự phát triển của công nghệ đa xử lý, để tận dụng tối đa sức mạnh của CPU, mô hình lập trình song song hay [multi-threading](https://en.wikipedia.org/wiki/Multithreading_(computer_architecture)) thường thấy trên các ngôn ngữ lập trình ra đời. Ngôn ngữ Go cũng phát triển mô hình lập trình song song rất hiệu quả với khái niệm Goroutines.
44

@@ -20,7 +20,7 @@ Kích thước cố định của stack sẽ dẫn đến hai vấn đề:
2020

2121
Giải pháp cho vấn đề này chính là cấp phát linh hoạt vùng nhớ stack:
2222
* Một Goroutines sẽ được bắt đầu bằng một vùng nhớ nhỏ (khoảng 2KB hoặc 4KB).
23-
* Khi gọi đệ quy sâu (không gian stack hiện tại là không đủ) Goroutines sẽ tự động tăng không gian stack (kích thước tối đa của stack có thể được đạt tới 1GB)
23+
* Khi gọi đệ quy sâu (không gian stack hiện tại là không đủ) Goroutines sẽ tự động tăng không gian stack (kích thước tối đa của stack có thể được đạt tới 1GB).
2424
* Bởi vì chi phí của việc khởi tạo là nhỏ, chúng ta có thể dễ dàng giải phóng hàng ngàn goroutines.
2525

2626
Go runtime có riêng cơ chế định thời cho Goroutines, nó dùng một số kỹ thuật để ghép M Goroutines trên N thread của hệ thống. Cơ chế định thời Goroutines tương tự với cơ chế định thời của `kernel` nhưng chỉ ở mức chương trình. Biến `runtime.GOMAXPROCS` quy định số lượng system thread hiện thời chạy trên các Goroutines.
@@ -337,7 +337,7 @@ func main(){
337337
}
338338
```
339339

340-
Với Go, bạn có thể đảm bảo rằng kết quả sẽ xuất ra bình thường bởi việc thêm vào thời gian sleep như sau
340+
Với Go, bạn có thể đảm bảo rằng kết quả sẽ xuất ra bình thường bởi việc thêm vào thời gian sleep như sau:
341341

342342
```go
343343
func main(){

ch1-basic/ch1-06-common-concurrency-mode.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 1.6. Concurrency Mode
1+
# 1.6. Mô hình thực thi đồng thời
22

33
Một điểm mạnh của Golang là tích hợp sẵn cơ chế xử lý đồng thời (concurrency). Lý thuyết về hệ thống tương tranh của Go là CSP (Communicating Sequential Process) được đề xuất bởi Hoare vào năm 1978. CSP được áp dụng lần đầu cho máy tính đa dụng T9000 mà Hoare có tham gia. Từ NewSqueak, Alef, Limbo đến Golang hiện tại, Rob Pike, người có hơn 20 năm kinh nghiệm thực tế với CSP, rất quan tâm đến tiềm năng áp dụng CSP vào ngôn ngữ lập trình đa dụng. Khái niệm cốt lõi của lý thuyết CSP cũng là của lập trình concurrency trong Go: giao tiếp đồng bộ (synchronous communication). Chủ đề về giao tiếp đồng bộ đã được đề cập trong phần trước. Trong phần này chúng ta sẽ tìm hiểu sơ lược về các mẫu concurrency phổ biến trong Golang.
44

0 commit comments

Comments
 (0)