Skip to content

Commit

Permalink
Merge pull request zalopay-oss#13 from zalopay-oss/feature/update-ch1-03
Browse files Browse the repository at this point in the history
Feature/update ch1-03
  • Loading branch information
anhldbk authored Sep 12, 2021
2 parents 1d39f35 + 021da0e commit 57baec1
Show file tree
Hide file tree
Showing 1,120 changed files with 734,489 additions and 63 deletions.
20 changes: 13 additions & 7 deletions ch1-basic/ch1-03-array-string-and-slice.md
Original file line number Diff line number Diff line change
Expand Up @@ -151,7 +151,7 @@ Cấu trúc [reflect.StringHeader](https://golang.org/src/reflect/value.go?s=565

```go
type StringHeader struct {
// con trỏ địa chỉ vùng nhớ string
// chứa đỉa chỉ trong bộ nhớ của con trỏ trỏ tới underlying array của string
Data uintptr
// chiều dài của string
Len int
Expand Down Expand Up @@ -192,7 +192,7 @@ s1 := "hello world"[:5]
s2 := "hello world"[6:]
```

Tương tự như array, String cũngmột hàm built-in `len` dùng để trả về chiều dài của string, ngoài ra bạn có thể dùng `reflect.StringHeader` để truy xuất chiều dài của string theo cách như sau
Tương tự như array, chúng tathể dùng hàm built-in `len` để trả về chiều dài của string, ngoài ra bạn có thể dùng `reflect.StringHeader` để truy xuất chiều dài của string theo cách như sau

```go
fmt.Println("len(s): ", (*reflect.StringHeader)(unsafe.Pointer(&s)).Len)
Expand Down Expand Up @@ -221,7 +221,7 @@ type SliceHeader struct {
```

Slice được xem là fat pointer, các bạn có thể đọc thêm ở bài viết sau để hiểu hơn về fat pointer trong [Go](https://nullprogram.com/blog/2019/06/30/). Cấu trúc slice bao gồm:
- `Data`: là con trỏ chứa địa chỉ của một array.
- `Data`: chứa đỉa chỉ trong bộ nhớ của con trỏ trỏ tới underlying array của slice.
- `Len`: độ dài của slice.
- `Cap`: kích thước tối đa mà vùng nhớ trỏ tới slice được cấp phát.

Expand Down Expand Up @@ -260,7 +260,7 @@ var (
)
```

Khi chúng ta sử dụng cú pháp tạo slice từ một slice cho trước như sau: **d = c[:2]** thì chúng ta nên lưu ý ở điểm sau. Slice sẽ không sao chép dữ liệu của slice gốc c qua d mà nó tạo ra một giá trị slice mới trỏ đến mảng ban đầu. Do đó, sửa đổi các phần tử của slice vừa được tạo sẽ sửa đổi các phần tử của slice gốc.Ví dụ minh hoạ:
Khi chúng ta sử dụng cú pháp tạo slice từ một slice cho trước như sau: **d = c[:2]** thì chúng ta nên lưu ý ở điểm sau. Slice sẽ không sao chép dữ liệu của slice gốc c qua d mà nó tạo ra một giá trị slice mới trỏ đến mảng ban đầu. Do đó, sửa đổi các phần tử của slice vừa được tạo sẽ sửa đổi các phần tử của slice gốc. Ví dụ minh hoạ:

```go
old := []byte{'r', 'o', 'a', 'd'}
Expand All @@ -279,7 +279,7 @@ Các tác vụ cơ bản trong slice bao gồm:
* Xóa phần tử trong slice

#### Duyệt qua slice
Duyệt qua slice thì tương tự như duyệt qua một arrays.
Chúng ta có thể sử dụng `for ... range` để duyệt qua slice.

```go
for i := range a {
Expand Down Expand Up @@ -307,7 +307,11 @@ a = append(a, 1, 2, 3)
a = append(a, []int{1,2,3}...)
```

Trong trường hợp slice ban đầu không đủ sức chứa khi thêm vào phần tử, hàm append sẽ hiện thực cấp phát lại vùng nhớ có kích thước gấp đôi vùng nhớ cũ và sao chép dữ liệu sang. Các bạn có thể xem đoạn mã nguồn về việc cấp pháp lại vùng nhớ cho slice [ở đây](https://golang.org/src/runtime/slice.go?fbclid=IwAR0xgVnf7SFJu_Kai8zo_5PZXolsuEL3JgfKejj7Ww0CpO1G82rbXbcWosQ#L66).
Trong trường hợp slice ban đầu không đủ sức chứa khi thêm vào phần tử, hàm append sẽ hiện thực cấp phát lại vùng nhớ có kích thước:
- Nếu kích thước cũ (cap) < 1024: cấp phát gấp đôi (x2) vùng nhớ cũ.
- Nếu kích thước cũ >= 1024: cấp phát 1.25x vùng nhớ cũ.

Sau đó, dữ liệu cũ sẽ được sao chép sang. Các bạn có thể xem đoạn mã nguồn về việc cấp pháp lại vùng nhớ cho slice [ở đây](https://golang.org/src/runtime/slice.go?fbclid=IwAR0xgVnf7SFJu_Kai8zo_5PZXolsuEL3JgfKejj7Ww0CpO1G82rbXbcWosQ#L66).

<div align="center">
<img src="../images/recapacity-slice.png"width="550">
Expand All @@ -317,7 +321,7 @@ Trong trường hợp slice ban đầu không đủ sức chứa khi thêm vào
</span>
</div>

Ví dụ bên dưới cho thấy giá trị **cap tăng gấp 2** khi thực thi hàm append vượt quá kích thước ban đầu.
Ví dụ bên dưới cho thấy giá trị **cap tăng gấp 2** khi thực thi hàm append vượt quá kích thước ban đầu (< 1024).

```go
func myAppend(sl []int, val int) []int{
Expand Down Expand Up @@ -541,6 +545,8 @@ a[len(a)-1] = nil
a = a[:len(a)-1]
```

Các bạn có thể tham khảo thêm bài blog của Golang về phần này [ở đây](https://go.dev/blog/slices).

## Liên kết
* Phần tiếp theo: [Functions, Methods và Interfaces
](./ch1-04-func-method-interface.md)
Expand Down
3 changes: 1 addition & 2 deletions docs/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,4 @@
.txt
_book
**/.DS_Store
gen.sh
/log
gen.sh
2 changes: 1 addition & 1 deletion docs/ch1-basic/ch1-01-genesis.html
Original file line number Diff line number Diff line change
Expand Up @@ -860,7 +860,7 @@ <h1 class="search-results-title">No results matching "<span class='search-query'
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"1.1 Nguồn gốc của ngôn ngữ Go","level":"1.2.1","depth":2,"next":{"title":"1.2 Sự tiến hóa của chương trình \"Hello World\"","level":"1.2.2","depth":2,"path":"ch1-basic/ch1-02-hello-revolution.md","ref":"ch1-basic/ch1-02-hello-revolution.md","articles":[]},"previous":{"title":"Chương 1: Nền tảng ngôn ngữ Go","level":"1.2","depth":1,"path":"ch1-basic/README.md","ref":"ch1-basic/README.md","articles":[{"title":"1.1 Nguồn gốc của ngôn ngữ Go","level":"1.2.1","depth":2,"path":"ch1-basic/ch1-01-genesis.md","ref":"ch1-basic/ch1-01-genesis.md","articles":[]},{"title":"1.2 Sự tiến hóa của chương trình \"Hello World\"","level":"1.2.2","depth":2,"path":"ch1-basic/ch1-02-hello-revolution.md","ref":"ch1-basic/ch1-02-hello-revolution.md","articles":[]},{"title":"1.3 Array, strings và slices","level":"1.2.3","depth":2,"path":"ch1-basic/ch1-03-array-string-and-slice.md","ref":"ch1-basic/ch1-03-array-string-and-slice.md","articles":[]},{"title":"1.4 Functions, Methods và Interfaces","level":"1.2.4","depth":2,"path":"ch1-basic/ch1-04-func-method-interface.md","ref":"ch1-basic/ch1-04-func-method-interface.md","articles":[]},{"title":"1.5 Khái niệm xử lý đồng thời và song song","level":"1.2.5","depth":2,"path":"ch1-basic/ch1-05-concurrency-parallelism.md","ref":"ch1-basic/ch1-05-concurrency-parallelism.md","articles":[]},{"title":"1.6 Mô hình thực thi đồng thời","level":"1.2.6","depth":2,"path":"ch1-basic/ch1-06-common-concurrency-mode.md","ref":"ch1-basic/ch1-06-common-concurrency-mode.md","articles":[]},{"title":"1.7 Error và Exceptions","level":"1.2.7","depth":2,"path":"ch1-basic/ch1-07-error-and-panic.md","ref":"ch1-basic/ch1-07-error-and-panic.md","articles":[]}]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":[],"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"ch1-basic/ch1-01-genesis.md","mtime":"2019-09-26T01:55:58.889Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-09-26T02:46:42.744Z"},"basePath":"..","book":{"language":""}});
gitbook.page.hasChanged({"page":{"title":"1.1 Nguồn gốc của ngôn ngữ Go","level":"1.2.1","depth":2,"next":{"title":"1.2 Sự tiến hóa của chương trình \"Hello World\"","level":"1.2.2","depth":2,"path":"ch1-basic/ch1-02-hello-revolution.md","ref":"ch1-basic/ch1-02-hello-revolution.md","articles":[]},"previous":{"title":"Chương 1: Nền tảng ngôn ngữ Go","level":"1.2","depth":1,"path":"ch1-basic/README.md","ref":"ch1-basic/README.md","articles":[{"title":"1.1 Nguồn gốc của ngôn ngữ Go","level":"1.2.1","depth":2,"path":"ch1-basic/ch1-01-genesis.md","ref":"ch1-basic/ch1-01-genesis.md","articles":[]},{"title":"1.2 Sự tiến hóa của chương trình \"Hello World\"","level":"1.2.2","depth":2,"path":"ch1-basic/ch1-02-hello-revolution.md","ref":"ch1-basic/ch1-02-hello-revolution.md","articles":[]},{"title":"1.3 Array, strings và slices","level":"1.2.3","depth":2,"path":"ch1-basic/ch1-03-array-string-and-slice.md","ref":"ch1-basic/ch1-03-array-string-and-slice.md","articles":[]},{"title":"1.4 Functions, Methods và Interfaces","level":"1.2.4","depth":2,"path":"ch1-basic/ch1-04-func-method-interface.md","ref":"ch1-basic/ch1-04-func-method-interface.md","articles":[]},{"title":"1.5 Khái niệm xử lý đồng thời và song song","level":"1.2.5","depth":2,"path":"ch1-basic/ch1-05-concurrency-parallelism.md","ref":"ch1-basic/ch1-05-concurrency-parallelism.md","articles":[]},{"title":"1.6 Mô hình thực thi đồng thời","level":"1.2.6","depth":2,"path":"ch1-basic/ch1-06-common-concurrency-mode.md","ref":"ch1-basic/ch1-06-common-concurrency-mode.md","articles":[]},{"title":"1.7 Error và Exceptions","level":"1.2.7","depth":2,"path":"ch1-basic/ch1-07-error-and-panic.md","ref":"ch1-basic/ch1-07-error-and-panic.md","articles":[]}]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":[],"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"ch1-basic/ch1-01-genesis.md","mtime":"2021-09-11T04:54:21.131Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2021-09-11T08:48:48.612Z"},"basePath":"..","book":{"language":""}});
});
</script>
</div>
Expand Down
2 changes: 1 addition & 1 deletion docs/ch1-basic/ch1-02-hello-revolution.html
Original file line number Diff line number Diff line change
Expand Up @@ -1078,7 +1078,7 @@ <h1 class="search-results-title">No results matching "<span class='search-query'
<script>
var gitbook = gitbook || [];
gitbook.push(function() {
gitbook.page.hasChanged({"page":{"title":"1.2 Sự tiến hóa của chương trình \"Hello World\"","level":"1.2.2","depth":2,"next":{"title":"1.3 Array, strings và slices","level":"1.2.3","depth":2,"path":"ch1-basic/ch1-03-array-string-and-slice.md","ref":"ch1-basic/ch1-03-array-string-and-slice.md","articles":[]},"previous":{"title":"1.1 Nguồn gốc của ngôn ngữ Go","level":"1.2.1","depth":2,"path":"ch1-basic/ch1-01-genesis.md","ref":"ch1-basic/ch1-01-genesis.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":[],"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"ch1-basic/ch1-02-hello-revolution.md","mtime":"2019-09-26T01:55:58.890Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2019-09-26T02:46:42.744Z"},"basePath":"..","book":{"language":""}});
gitbook.page.hasChanged({"page":{"title":"1.2 Sự tiến hóa của chương trình \"Hello World\"","level":"1.2.2","depth":2,"next":{"title":"1.3 Array, strings và slices","level":"1.2.3","depth":2,"path":"ch1-basic/ch1-03-array-string-and-slice.md","ref":"ch1-basic/ch1-03-array-string-and-slice.md","articles":[]},"previous":{"title":"1.1 Nguồn gốc của ngôn ngữ Go","level":"1.2.1","depth":2,"path":"ch1-basic/ch1-01-genesis.md","ref":"ch1-basic/ch1-01-genesis.md","articles":[]},"dir":"ltr"},"config":{"gitbook":"*","theme":"default","variables":{},"plugins":[],"pluginsConfig":{"highlight":{},"search":{},"lunr":{"maxIndexSize":1000000,"ignoreSpecialCharacters":false},"sharing":{"facebook":true,"twitter":true,"google":false,"weibo":false,"instapaper":false,"vk":false,"all":["facebook","google","twitter","weibo","instapaper"]},"fontsettings":{"theme":"white","family":"sans","size":2},"theme-default":{"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"},"showLevel":false}},"structure":{"langs":"LANGS.md","readme":"README.md","glossary":"GLOSSARY.md","summary":"SUMMARY.md"},"pdf":{"pageNumbers":true,"fontSize":12,"fontFamily":"Arial","paperSize":"a4","chapterMark":"pagebreak","pageBreaksBefore":"/","margin":{"right":62,"left":62,"top":56,"bottom":56}},"styles":{"website":"styles/website.css","pdf":"styles/pdf.css","epub":"styles/epub.css","mobi":"styles/mobi.css","ebook":"styles/ebook.css","print":"styles/print.css"}},"file":{"path":"ch1-basic/ch1-02-hello-revolution.md","mtime":"2021-09-11T04:54:21.132Z","type":"markdown"},"gitbook":{"version":"3.2.3","time":"2021-09-11T08:48:48.612Z"},"basePath":"..","book":{"language":""}});
});
</script>
</div>
Expand Down
Loading

0 comments on commit 57baec1

Please sign in to comment.