Tải bản đầy đủ (.pdf) (36 trang)

LẬP TRÌNH NÂNG CAO (CO2039) bài tập lớn tìm hiểu về ngôn ngữ golang

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.46 MB, 36 trang )

ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
ĐẠI HỌC BÁCH KHOA
KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH

LẬP TRÌNH NÂNG CAO (CO2039)
Bài tập lớn

Tìm hiểu về ngơn ngữ
Golang
GVHD:
Sinh viên:

Trương Tuấn Anh
Đặng Quang Huy - 2012504 - L05

THÀNH PHỐ HỒ CHÍ MINH, THÁNG 5 2022


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

Contents
1 Giới thiệu chung
1.1 Tổng quan . . . . . . . . . . .
1.2 Lịch sử phát triển . . . . . .
1.2.1 Generic Programming
1.2.2 Các phiên bản đã phát

.
.
.


.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.

.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.

.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

2
2
2
4
5

2 Go - Một ngơn ngữ lập trình tuyệt vời
2.1 Đặc điểm . . . . . . . . . . . . . . . . . . . . . . . .

2.1.1 Open-source . . . . . . . . . . . . . . . . . . .
2.1.2 Static-typing . . . . . . . . . . . . . . . . . .
2.1.3 Concurrency Support . . . . . . . . . . . . .
2.1.4 Powerful Standard Library và Tool Set . . . .
2.1.5 Testing Capabilities . . . . . . . . . . . . . .
2.1.6 Garbage Collection . . . . . . . . . . . . . . .
2.1.7 Kết Luận . . . . . . . . . . . . . . . . . . . .
2.2 Điểm mạnh . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Easy Learning Curve . . . . . . . . . . . . . .
2.2.2 Simplicty và Speed . . . . . . . . . . . . . . .
2.2.3 Package System . . . . . . . . . . . . . . . . .
2.2.4 Multithreading và Concurrency . . . . . . . .
2.2.5 Inbuilt Testing và Profiling Framework . . . .
2.3 Những mặt hạn chế . . . . . . . . . . . . . . . . . .
2.3.1 Quá Đơn giản . . . . . . . . . . . . . . . . . .
2.3.2 Không hổ trợ Máy Ảo (Virtual Machine) . .
2.3.3 Errol Handeling có thể trở nên tốt hơn . . . .
2.3.4 Những lỗi còn tồn động với IOS Development
2.3.5 Những vấn đề về Runtime Safety . . . . . . .
2.3.6 Một ngôn ngữ còn non trẻ . . . . . . . . . . .
2.4 Cách sử dụng . . . . . . . . . . . . . . . . . . . . . .
2.4.1 Download Golang . . . . . . . . . . . . . . .
2.4.2 Hello World! . . . . . . . . . . . . . . . . . .
2.4.3 Cấu trúc chương trình . . . . . . . . . . . . .
2.4.4 Syntax cơ bản . . . . . . . . . . . . . . . . .
2.4.5 Các kiểu Data . . . . . . . . . . . . . . . . .
2.4.6 Variables . . . . . . . . . . . . . . . . . . . .
2.4.7 Constants . . . . . . . . . . . . . . . . . . . .
2.4.8 Operator . . . . . . . . . . . . . . . . . . . .
2.4.9 Decision making trong Go . . . . . . . . . . .

2.4.10 Vòng lặp . . . . . . . . . . . . . . . . . . . . .
2.4.11 Function . . . . . . . . . . . . . . . . . . . . .
2.4.12 Array . . . . . . . . . . . . . . . . . . . . . .
2.4.13 Struct . . . . . . . . . . . . . . . . . . . . . .
2.4.14 Map . . . . . . . . . . . . . . . . . . . . . . .
2.4.15 Gouroutine và Channels . . . . . . . . . . . .
2.4.16 Xuất Output ra màn hình . . . . . . . . . . .

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.
.
.
.
.
.
.

.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.

.

6
6
6
6
7
7
7
7
7
8
8
8
9
9
9
10
10
10
10
10
10
11
11
11
12
13
13
14

15
16
17
19
23
24
26
27
28
29
32

3 Tổng kết

Bài Tập lớn Lập Trình Nâng Cao - CO2039

. . . .
. . . .
. . . .
hành

.
.
.
.

.
.
.
.


.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.


34

Page 1/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

1
1.1

Giới thiệu chung
Tổng quan

Go (cịn được biết đến với các tên gọi khác như Golang hoặc Go Language) là một ngơn ngữ
lập trình được phát triển bởi Google, Đây là một loại ngơn ngữ có mã nguồn mở (open-source,
statically-typed compiled, và là một ngôn ngữ lập trình rõ ràng (explicit programming language).
Đây cũng là một ngơn ngữ lập trình đa mơ hình (multi-paradigm) và hướng đối tượng (objectoriented). Go là một ngôn ngữ được dùng phổ biến tại Google và cùng với nhiều tổ chức khác
với các project có mã nguồn mở.
Go được truyền cảm hứng bởi hai loại ngơn ngữ lập trình phổ biến khác là Python và C.
Go thừa hưởng sự đơn giản từ Python và sự hiệu quả của C .

Hình 1: Go Language
Sự thật thú vị: Golang (Một tên gọi khác của Go) bắt nguồn từ tên miền trang chủ chính
thức của Go. Nó thực sự rất hữu dụng bởi việc tìm kiếm keyword "Golang" sẽ thuận tiện hơn
nhiều so với keyword "Go" khi sử dụng cơng cụ tìm kiếm Google. (Nó sẽ giúp ta dễ hơn trong
việc tìm kiếm thơng tin về ngơn ngữ lập trình này)

1.2


Lịch sử phát triển

Trước khi Go ra đời, việc sử dụng các ngôn ngữ phực tạp để giải quyết các vấn đề lớn trở
nên khó khắn. Như đối với ngơn ngữ C++, để có thể giải quyết vấn đề bằng ngơn ngữ này có
thể mất cả ngày dài. Điều này vốn không hợp lý , cả về thời gian tiêu tốn lẫn năng suất hoạt động.
Người đã đặt các nền móng đầu tiên cho ngơn ngữ lập trình Go bao gồm: Robert Griesemer,
Rob Pike, và Ken Thompson - những kỹ sư phần mềm đến từ Google. Họ đều có chung một
mục đích: tạo ra được một ngơn ngữ lập trình có thể dễ dàng sử dụng nhưng vẫn có thể bao
quát được những vấn đề chính trong q trình làm việc với các hệ thống phức tạp.
Vào năm 2007, Go được thiết kế - với ứng dung trong việc cải thiện năng suất lập trình trong
thời đại của multicore, networked machines và lagre corebase. Từ Go, các nhà thiết kế dã cố gắng

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 2/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

khắc phục những điểm yếu nhưng vẫn giữ nguyên những tính năng tối ưu của các ngơn ngữ lập
trình khác.

Hình 2: Từ trái sang phải: Robert Griesemer, Rob Pike, và Ken Thompson
Go được ra mắt với cộng đồng vào tháng 11 năm 2009, và phiên bản 1.0 được tiếp tục giới
thiệu vào tháng 3 năm 2012.
Vào tháng 11/2016, Go và Go Mono fonts được ra mắt bởi hai nhà thiết kế: Charles Bigelow và
Kris Holmes, được chuyên dụng cho các project sử dụng ngôn ngữ Go.
Tháng 4/2018, Logo của ngôn ngữ đã được thay thế bằng biểu tượng GO cách điệu nghiêng

bên phải với các đường nét ở cuối.

Hình 3: Logo của ngơn ngữ lập trình Go

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 3/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

1.2.1

Generic Programming

Generic programming (Lập trình tổng qt) là mơt dạng lập trình máy tính mà trong đó, thuật
tốn được viết theo dạng được xác định sau và sau đó được khởi tạo (instantiate) nếu cần cho
một kiểu cụ thể mà được cung cấp như tham số.
Sự thiếu hụt của việc hộ trợ Generic programming trong những phiên bản đầu tiên của Golang
đã dấy lên những tranh luận đáng lưu ý. Các nhà lập trình đã bày tỏ sự hứng thú với generic
programming và ghi chú rằng nó đã được tích hợp vào các hàm (functions) với kiểu chung chung
(type-generic), những kiểu được sử dụng trong những trường hợp đặc biệt. Pike - một trong
những lập trình viên thiết kế Golang, nghĩ rằng một lúc nào đó điểm yếu này có thể được cải
tiến.
Vào tháng 4/2018, những nhà phát triển chính của Go đã cho ra mắt các dự thảo về thiết
kể generic programming và error-handling, từ đó thu thấp các phản hồi của người dùng. Nhưng
đề xuất về error-handling đã bị loại bỏ.
Tháng 6/2020, một tài liệu thiết kế dự thảo mới được xuất bản nhằm bổ sung những cú pháp
cần thiết cho Go để khai báo các hàm và kiểu chung. Một công cụ dịch mã, go2go đã được cung

cấp cho người dùng với mục đích thử những cú pháp mới, cùng với phiên bản hỗ trợ chung với
Go Playground trực tuyến.
Với phiên bản 1.18 của Go, Generic programming đã được tích hợp nhằm tối ưu hóa ứng dụng
cho các lập trình viên.

Hình 4: An Example of Generic Programming in Golang

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 4/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

1.2.2

Các phiên bản đã phát hành

Các phiên bản của Go đều đảm bảo tính tương thích với việc đặc tả ngơn ngữ và các phần chính
của thư viên chuẩn.
Dưới đây là bảng thống kê các phiên bản đã được phát hành của ngôn ngữ Golang.
Release
go1
go1.1
go1.2
go1.3
go1.4
go1.5
go1.6

go1.7
go1.8
go1.9
go1.10
go1.11
go1.12
go1.13
go1.14
go1.15
go1.16
go1.17
go1.18

Status
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life
End-of-life

End-of-life
Maintenance
Current

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Release Date
2012-03-28
2013-05-13
2013-12-01
2014-06-18
2014-12-10
2015-08-19
2016-02-17
2016-08-15
2017-02-16
2017-08-24
2018-02-16
2018-08-24
2019-02-25
2019-09-03
2020-02-25
2020-08-11
2021-02-16
2021-08-16
2022-03-15

Maintenance end
2013-12-01
2014-06-18

2014-12-10
2015-08-19
2016-02-17
2016-08-15
2017-02-16
2017-08-24
2018-02-16
2018-08-24
2019-02-25
2019-09-03
2020-02-25
2020-08-11
2021-02-16
2021-08-16
2022-03-15
Q3 2022
Q1 2023

Page 5/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

2

Go - Một ngơn ngữ lập trình tuyệt vời

2.1


Đặc điểm

Ngơn ngữ Go, xt hiện trên thị trường vào năm 2009, được thiết kế với mục đích nhằm nâng
cao các sản phẩm ứng dụng thuộc các ngành bao gồm: networked machines, multicore, và huge
codebases. Một trong những điểm tuyệt vời mà Go đã thể hiện cho chúng ta là:
• Static typing và runtime efficiency của C++
• Usability và Readability của Python và Javascript
• Khái niệm Lập trình hướng đối tượng (OOP) của SmallTalk.
• Concurrency element của Newsqueak.
Sau đây chúng ta sẽ đi sâu phân tích các đặc điểm của Go.
2.1.1

Open-source

Đặc điểm đầu tiên của ngôn ngữ lập trình Golang là nó là một ngơn ngữ lập trình có mã nguồn
mỡ. Nghĩa là, mọi người có thể tải và thử nghiệm với code để có thể mang đến những source
code tốt hơn và sưa lại những bug liên quan.

Hình 5: Đắc diểm Open-source
2.1.2

Static-typing

Go là một ngơn ngữ statically-typed và làm việc với cơ chế biên dịch code một cách chính xác
trong khi đang quan tâm tới kiểu của chương trình và mức độ tương thích. Nó sẽ giúp cho các
lập trình viên được tự do hơn trong việc khắc phục các khó khắn so với khi sử dụng các ngơn
ngữ dynamically-typed.

Bài Tập lớn Lập Trình Nâng Cao - CO2039


Page 6/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

2.1.3

Concurrency Support

Một trong những đặc tính mạnh mẽ của ngơn ngữ lập trình Go là việc hộ sự đồng thời thực thi
(concurrency).
Golang, không như các ngơn ngữ lập trình khác, đề xuất những lựa chon đồng thời dễ dàng
và dễ tìm kiếm hơn. Nó giúp cho những lập trình viên mảng phần mềm dễ dàng hơn trong việc
hoàn thành các yêu cầu một cách nhanh nhất có thể. giải phóng các tài nguyên đã đữ phân bổ
và sự dụng và kết nối với nhau sớm hơn, và nhiều hơn thế nữa.
2.1.4

Powerful Standard Library và Tool Set

Ngơn ngữ lập trình Go cũng cho ra với một thư viên tiêu chuẩn mạnh mẽ. Những thư viện này
cho phép chúng ta sử dụng các component phong phú, giúp cho các nhà phát triển tránh khỏi
viêc phải sử dụng các gói của bên thứ 3.
Ngồi ra, nó cũng đưa ra cho chúng ta một lượng lớn các công cụ giúp cho việc phát triển
tiến trình thêm hiểu quả, như là:
• Gofmt: Nó giúp tự động chỉnh sửa định dạng code của ngơn ngữ Go, bới sự khó khắn của
nó trong tính readability.
• Gorun: Cơng cụ này dùng để thêm vào các "bang line" trong code nguồn để chạy nó, hoặc
chạy các dịng code sode một cách rõ ràng. Nó thường được sử dụng bới các nhà lập trình
Go trong q trình thử nghiệm nó với những dịng mã được viết bằng Python.

• Goget: Đây là cơng cụ dùng để tải về các thư viện từ GitHub và lưu trử nó ở GoPath, từ
đó giúp cho các lập trình viên có thể để dạng inport các thư viện trong các project.
• Godoc: Là một cơng cụ dùng để phân tích mã nguồn code của ngôn ngữ Golang, bao gồm
các comment và tạo a một văn bản băng HTML hoặc một định dạng văn bản thuần. Văn
bản được tạo ra thường được gắn chặt với code của văn bản và có thể được định vị một
cách dễ dàng với một cú click chuột.
2.1.5

Testing Capabilities

Ngơn ngữ Go cịn có thể đề xuất những cơ hội để viết các unit tests cùng với việc viết app codes.
Bên cạnh đó, nó cúng giúp hổ trợ trong việc hiểu được độ bao phủ của code, các bài kiểm tra
hiệu suất, và viết các code mâu để sáng tạo nên những tệp code riêng của mọi người.
2.1.6

Garbage Collection

Go còn cung cấp cho người sử dụng một sức mạnh tuyệt vời bộ thu gom rác (garbage collection).
Nghĩa là, nhà phát triển khơng cịn phải lo lắng về việc giải phóng các con trỏ (pointers) hoặc
những tình huống liên quan đến lung lẳng pointers (Dangling pointer là một con trỏ trong mã
đó dẫn đến các khối bộ nhớ sai hoặc đối với một số điểm đến ngoài ý muốn) nữa.
2.1.7

Kết Luận

Nhờ những đặc điểm đã được nêu ở trên, Go đã được đón nhận bới rất nhiều sự quan tâm của
rất nhiều những tập đoàn nổi tiềng khác ngồi Google như: Apple, Twitter, Facebook,...

Bài Tập lớn Lập Trình Nâng Cao - CO2039


Page 7/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

Hình 6: Những tập đồn đã và đang sử dụng Go
Ngoài ra, Go cũng là một trong những ngôn ngữ được ứng dụng các công ty nhỏ cũng như
các start up để tao những phần mềm cần thiết. Và từ đó chúng ta có thể thấy được những thành
tựu tuyệt vời của chúng. Từ đó chúng ta phải tìm hiều được những điểm mạnh điểm u của
ngơn ngữ này nhằm có thể sử dung nó một cách tối ưu hơn, tạo tiền đề cho viêc phát triển ngơn
ngữ nói riêng và lập trình ứng dụng nói chung.

2.2
2.2.1

Điểm mạnh
Easy Learning Curve

Với những coder mớt bất đầu. Go là một ngơn ngữ lập trình cho q trình trải nghiệm viết code
của họ với một ngôn ngữ (statically-typed), và còn hơn thế, việc học những thứ căn bản của Go
trong một đêm là điều có thể . Tất nhiên, nó khơng khiên chúng ta trở thành những người giỏi
trong việc code, chúng ta phải hiểu rõ về thư viện tiêu chuẩn của ngôn ngữ, luyện tập thật nhiều
và chuyên sâu, cùng với những mức độ thích hợp, những những điều giản đơn của Go có thế
được học một cách dễ dàng.
Với những nhà lập trình đến từ những ngôn ngữ khác. Go rất là gần với C nhưng lại có thêm
những điểm mới như: garbage collection, structual typing, và CSP-style concurrency.
Đươc phát triển bởi Google, Go cài đặt những tiêu chuẩn nhất định cho các tài liều. Với sự
rõ ràng và dễ dàng để nắm bắt. Những điều cơ bản của Go đã được định nghĩa một cách dễ hiểu
nhất khi chung ta cố gắng tiếp cận nó. Các Blog về Go cũng cung cấp cho chung những nguồi

tài liệu cho những nhà lập trình để có thể nâng cao trình độ của mỗi người.
2.2.2

Simplicty và Speed

Go là một ngơn ngữ lập trình tối giản. Hầu hết, thì đó là một điều tốt. Lõi của ngơn ngữ bao
gồm một số các tính năng đơn giản, trực giao, từ đó có thể được kết hơp theo số lượng nhỏ tương
đối các cách. Điều đó khiến cho việc học ngơn ngữ, đọc và viết chương trình trở nên dễ dàng hơn.
Ngơn ngữ Go có khả năng tạo ra một executable code, có thể được sao chép mà khơng phá
hủy các dependencies
Go cung cấp một số lợi ích thú vị về speed. Một chương trình Go được biên dịch thẳng thành mã
Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 8/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

máy, nên đương diên nó sẽ hoạt động tốt hơn so với các ngôn ngữ thơng dịch (interpreted) hoặc
có thời gian chạy ảo (virtual runtime). Khơng chỉ những kết quả biên dịch một chương trình
thực sự nhanh, mà tệp nhị phân được biên dich có dung lượng nhỏ đến mức kinh ngạc.
Chúng ta đã đề cập đến cách mà Go xử lý tệp code của ngơn ngữ này. Nhưng có một bược
tiến xa hơn nữa trong việc khiến cho chương trình của ngơn ngữ Go trở nên tối ưu. Godoc là
một cơng cụ phân tích mã tĩnh giúp nhà lập trình viên có thể tạo những những tệp code đẹp
mắt mà không sử dụng thêm bất kỳ một ngơn ngữ ngồi nào khác, như Javadoc, PHPDoc...
Nó sẽ sử dung nhiều thơng tin nhất có thể từ tệp code, từ đó phác thảo, cấu trúc và tái định
dạng lại nó. Nó sẽ được cập nhật với các tính năng nâng cao hơn bao gồm tham chiếu chéo, mãu
code và liên kết trực tiếp đến kho lưu trữ hệ thống kiểm soát các phiên bản lúc trước.
2.2.3


Package System

Với nhưng ai bắt đầu làm quen với ngôn ngữ lập trinh Go, packages có thể quen thuộc với nhà
lập trình viên nếu như họ đã có kinh nghiệm và từng tiếp xúc với ngôn ngữ Java hoặc C/C++.
Với những người khác, theo thuật ngữ cơ bản, thì packages là một thực mục bên trong chương
trình của mà để lưu trử các source codes, dependencies hoặc có thể nhiều packages hơn. Những
packages đưa ra những đoạn code rời rạc rõ ràng và tăng hiểu quả quản lý cho những thành
phần phụ thuộc (dependencies.
Cơ chế packages là một trong những tính năng được thiết kể đơn giản nhưng hiệu quả được
tích hợp trong ngôn ngữ này, và chắn là một trong những lợi ich tuyệt vời nhất khi sử dụng ngôn
ngữ Go.
2.2.4

Multithreading và Concurrency

Những ngơn ngữ lập trình hiện nay đều phải đối mặt với vấn đề phân bổ tài nguyên ngày càng
khó khắn bởi phần cứng đang dần trở nên phức tạp hơn. Thường lệ, các nhà chế tạo sẽ chỉ thêm
vào nhiều lõi (cores) hơn vào hệ thống nhằm nâng cao hiệu năng. Với mỗi core được thêm vào,
hệ thống lại cần phải duy trì nhiều sự kết nối dữ liệu với nhau thông qua microservices, quản lý
sự gia tăng số lượng của hàng đợi (queues) and duy trì caches.
Các phần cứng hiện này cần những được lập trình bởi những ngơn ngữ có hổ trợ sự đồng
thời concurrency, và có khả năng hỗ trợ cho hệ thơng đa lõi (multi-core systems) trong tương
lai.
Go được hưởng lợi từ việc được phát triển trong thời kỳ mà các hệ thống đa lõi ngày càng
trở nên phổ biến và có sẵn rộng rãi trên các phần cứng phức tạp. Vì tế, các nhà lập trình đặc
biệt chú ý vào việc hỗ trợ đồng thời, phát triển ’goroutines’ thay vì các luồng - cho phép ngôn
ngữ xử lý đồng thời một số lượng lớn các tác vụ tại một thời điểm trong một model được gọi là
CSP (Communicating Sequential Processes). Thay vì khóa các biến để chia sẻ bộ nhớ, Go cho
phép bạn truyền giá trị được lưu trữ trong biến của bạn từ luồng này sang luồng khác.

2.2.5

Inbuilt Testing và Profiling Framework

Với một lập trình viên sử dụng ngơn ngữ Javascript, việc cố gằng tìm kiếm một testing framework
cho một project thật sự là một điều khó khăn. Với Go, ngơn ngữ này kèm theo một công cụ kiêm

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 9/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

tra được xây dựng với sự đơn giản và hiệu quả. Nó cung cấp cho người dùng các API đơn giản
nhất có thể và đưa ra các giả định tối thiểu. Nó có thể được sử dụng cho các loại thử nghiệm,
profiling, thậm chí để cung cấp các ví dụ về mã thực thi. Nó cũng có thể hỗ trợ các tính năng
kiểm tra nâng cao như kiểm tra song song, bỏ qua cấu hình và nhiều tính năng khác.

2.3

Những mặt hạn chế

Ngoại những thế mạnh mà Go đã thể hiện ở trên. Còn tồn tại những điểm yếu của ngôn ngữ
cần được khắc phục nhằm có thể tối ưu hóa hơn ngơn ngữ lập trình nà.
2.3.1

Quá Đơn giản


Sự đơn giản của Go là một trong những thể mạnh tuyệt vời của ngôn ngữ này. Tuy nhiên, điều
đó dẫn đến việc ngơn ngữ này thiếu đi sự lịnh hoạt như một điều tất yếu. Trong khi nhưng ngơn
ngữ khác có thể khó tiếp thu hơn, chúng đưa ra những mực trừu tượng cao mà giúp cho coders
có thể đạt được những kết quả độc nhất, phức tạp và sáng tạo hơn.
2.3.2

Không hổ trợ Máy Ảo (Virtual Machine)

Google mong muốn Ngôn ngữ Go không hướng tới mục địch phát triển mảng máy ảo ((virtual
machine-base)). Nó giúp chúng ta trong việc dễ sử dụng. Nó lại mang đến một số hạn chế.
Vms sẽ cho chúng ta những đoạn code hiệu quả, nghĩa là kích thước của một file Go thường nhỏ
hơn so với các ngôn ngữ khác. Trong khi Googles đang cố gắng từng bước cải thiện tính hiệu
quả của ngơn ngữ này trong một vài năm qua, chúng ta có thể kỳ vọng hơn về những chương
trình phực tạp được viết bởi Go có thể nhanh chóng trong việc sử dụng bộ nhớ.
2.3.3

Errol Handeling có thể trở nên tốt hơn

Trong ngôn ngữ Go, tất các lỗi đều là những giá trị. Bởi vì điều đó, một số các fair function
(hàm hợp lý) sẽ kết thúc bằng việc trả một kết quả lỗi. Nó dẫn đến một vấn để rằng nơi mà
nguồn gốc của lỗi bị mất có thể dẫn đến sự thiếu hụt logic trong việc sửa chữa và fix lôi một
cách hiểu quả. Các nhà lập trình Go cần phải viết những đoạn code sửa chữa lỗi để có thể thơng
báo về các điều kiện sai cụ thể của lỗi đã bị mất. Khi mà code chỉ tập tring vào sự đơn giản và
giảm việc lặp lại quả nhiều lần của code, nó có thể trở thành một vấn đề khó giải quyết.
2.3.4

Những lỗi cịn tồn động với IOS Development

Dựa trên những bài test nhanh trên các diễn đàn khắc phục sự cố ở hệ điều hành Ios, chúng sẽ
cho ta thấy rất các lập trình đang vật lộn với các truy vấn về phát triển ứng dụng iOS bằng

ngơn ngữ Go. Điều này có thể sẽ ít được quan tâm hơn khi Go được phát triển trong thời gian
tới, những vẫn là một điểm yêu của Go hiện tại khi nhiều nhiều nhà phát triển đa nền tảng phải
chuyển sang sử dụng C# trên Xamarin để có thể viết và cho ra các phần mềm bao gồm hệ điều
hành Android và iOS.
2.3.5

Những vấn đề về Runtime Safety

So sánh với các ngơn ngữ lập trình cịn lại, Go có thể được coi là một ngơn ngữ tương đối an
tồn nhưng nó lại gần như khơng mang tính bảo mật cao như các ngơn ngữ như Rust,... Tuy
nhiên, lỗ hổng này chỉ tồn tại trong quá trình biên dịch và ở mực độ nhất định là thời gian chạy.

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 10/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

Go tập trung vào tốc độ của sản phẩm, còn Rust lại chú trọng hơn trong vấn đề bảo mật.
2.3.6

Một ngơn ngữ cịn non trẻ

Khởi đầu vào năm 2007, tuổi đời của ngôn ngữ này vẫn cịn rất trẻ so với các ngơn ngữ cạnh
tranh cịn lại. Các thư viện chính của Go có thể được thiết kế một cách thông minh và hiệu quả,
nhưng để có thể so sánh với những ngơn ngữ như Java - một ngôn ngữ đã được hỗ trợ bằng một
sự tổng hợp đồ sộ các mã nguồn và một loạt những thư viên mới được tạo bởi một cộng đồng
nhiệt tình và gắn bó với ngơn ngữ này. Cho đến khi Go có thể bắt kịp được, nó vẫn còn một con

đường dài để đi trong việc hổ trợ các thư viện.

2.4
2.4.1

Cách sử dụng
Download Golang

Đầu tiên, vào trang chủ chính của của ngơn ngữ Go go.dev. Chúng ta sẽ được màn hình hiển thị
như sau.

Hình 7: Trang chủ chính thức của Go
Nhấn vào mục Download, chúng sẽ đi tới trang web hướng dẫn cách thức tải xuống ngôn ngữ
lập trình Go.

Hình 8: Trang web Download Golang

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 11/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

Chọn phiên bản Golang thích hợp với hệ điều hành đang sử dụng và tải về.
Nếu lập trình viên có khúc mắc trong việc tải về Golang. Nhân vào mục installation instruction
để được giải thích chi tiết hơn về cách download và chọn phiên bản phù hợp cho người sử dụng.

Hình 9: Trang hướng dẫn Download Golang

Sau khi đã setup xong, chúng ta sẽ bắt đầu một cuộc hành trình mới với ngơn ngữ Golang.
2.4.2

Hello World!

Để làm quen với Golang, chúng ta sẽ bắt đầu với chương trình Hello World đơn giản.
1

package main

2
3

import " fmt "

4
5
6
7
8

func main () {
/* This is my first sample program . */
fmt . Println ( " Hello , World ! " )
}

Listing 1: Code Go cho Hello World
Chạy file code để thấy dịng chữ "Hello, World!" trên màn hình console.
$ go run
Hello, World!

Lệnh go run là một trong các lệnh phổ biến để chạy chương trình Go, sử dụng lệnh go help để
biết thêm những cú pháp khác.
$ go help

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 12/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

2.4.3

Cấu trúc chương trình

Một chương trình được viết bằng Go, cơ bản sẽ có những phần như sau:
• Kháo báo Package
• Import Package
• Hàm (Functions)
• Biến (Variables)
• Statements và Expressions
• Comments
Dựa trên chương Hello Word ở mục 2.4.2, chúng ta sẽ giải thích đoạn code như sau:
• Dịng đầu tiên của chương trình khai báo tên của package cần thiết cho chương trình. Đó là
một câu lệnh bắt buộc, vì mơi chương trình Go chạy trong các packages. Như trong chương
trình trên, main package là điểm bắt đầu thể thực thi chương trình. Mỗi packages đều có
đường dẫn và tên của nó.
• Dịng tiếp théo là import "fmt", đây là một lệnh tiền xử lý, giúp cho trình biên dịch của
ngơn ngữ Go nhận biết những file cần thiết dựa trên package fmt.

• dịng tiếp theo là hàm main() là hàm hàm chính nơi mà chương trình thực thi
• /*...*/ là phần Comments (Chú thích), trình biên dịch sẽ khơng quan tâm đến chúng và
đây à nơi nhà lập trình chú thích những điều cần lưu ý ( có thể sử dụng // )
• fmt.Println(...) là một hàm khác có sẵn trong Go, có chức năng đưa dịng "Hello World"
lên màn hình. Package fmt đã xuất phương thức Println dùng để giúp xuất kết quả là một
kiểu tin nhắn ra màn hình .
2.4.4

Syntax cơ bản

Trong Go, chúng ta những Syntax cơ bản như sau:
• Token: Một chương trình Go chưa rất nhiều Tokens, nó có thể là một KeyWord, một
Identifier, một constant, một string literal, hoặc một Symbol. Ví dụ: Trong dịng code:
fmt.Println("Huy"), nó đã chưa 6 tokens bao gồm: fmt, ’.’, Println, ’(’, "Huy", ’)’.
• Line Separator : Trong một chương trình Go, line separator là điểm kết thúc của statement
Ví dụ:
1
2

fmt . Println ( " Hello , World ! " )
fmt . Println ( " I am in Go Programming World ! " )

3

Listing 2: Ví dụ của Line Separator
• Comments: Chú thích giúp được sử dụng bởi các lập trình viên giúp chúng ta có thể deexx
dàng hơn trong việc đọc và hiểu code Ví dụ:

Bài Tập lớn Lập Trình Nâng Cao - CO2039


Page 13/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

1

/* my first program in Go */

2

Listing 3: Ví dụ của Comments
• Identifiers: Một nhận dạng của Go là một tên gọi để nhận diện các biến, hàm, hoặc những
item khác do người dùng định nghĩa. Ví dụ:
1
2

mahesh kumar abc move_name a_123
myname50 _temp j a23b9 retVal

3

Listing 4: Ví dụ của Identifiers
• Keyword : Một số từ định danh dành riêng trong Go, không thể sự dụng làm tên biến,
constant hoặc identifiers. Ví dụ:

Hình 10: Một số Keywword trong Go
• White space: Khoảng trắng dùng để miêu tả các dấu cách, tabs, newline characters và
comments.

2.4.5

Các kiểu Data

Các kiểu dữ liệu Data có thể được phân loại như sau:
1. Boolean types: Là kiểu Data logic và chưa 2 giá trị định nghĩa: True và False
2. Numeric types: là kiểu data dạnh số và có đại diện chính là kiểu Interger và Floating.
• Interger type:
uint8: 0 - 255
uint16: 0 - 65535
uint32: 0 - 4294967295
uint64: 0 - 18446744073709551615
int8: -128 - 127
int16: -32768 - 32767
int32: -2147483648 - 22147483647
int64: -9223372036854775808 - 9223372036854775807
• Floating types:
float32: IEEE-754 32-bit floating-point numbers

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 14/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

float64: IEEE-754 64-bit floating-point numbers
complex64: Complex numbers với float32 real và imaginary parts
complex128: Complex numbers với float64 real và imaginary parts

• Một số kiểu Numeric khác:
byte: như unit8
rune: như int32
unit: 32 hoặc 64 bit
init: như unit
uintptr: số nguyên không dấu để lưu trữ uninterpreted bits của con trỏ
3. String types: đại điện cho tập hợp các kí tự. Giá trị của nó là một chuổi các bytes.
4. Derived types: Bao gồm: Pointer types, Array types, Structure types, Union types, Function
types, Slice types, Interface types, Map types và Channel Types.
2.4.6

Variables

Tên của các biến sẽ bao gồm các ký tự, số và dấu ’_’. Nó buộc phát bắt đầu bằng một ký tự hay
là dấu ’_’. Chữ thường và chứ hoa sẽ được phân biệt ớ trong Go. Khi kháo một biến ở trong
Go, chúng ta sẽ khai báo bằng cách như sau:
var variable_list o p t i o n a l _ d a t a _ t y p e ;

1

Listing 5: Ví dụ về Khai báo biến
Với optional_data_type là các kiểu dữ liệu hợp lệ của Go như: byte, int,... Ví dụ:
var i , j , k int ;
var c , ch byte ;
var f , salary float32 ;

1
2
3


Các biến cung có thể được cúng cấp giá trị trước khi khai báo kiểu, kiểu của biến sẽ được trình
biên dịch đánh giá dựa trên giá trị cảu chúng.
variable_name = value ;

1

Listing 6: Ví dụ về Khởi tạo giá trị đầu
Ví dụ:
huy = 123 // huy will be assigned as 123 , Here huy is int

1

Chúng ta có 2 kiểu khai báo, bao gồm: khai báo tĩnh và khai báo động
• Khai báo tĩnh: Cung cấp sự đảm bảo cho trình biên dịch rằng có một biến có sẵn với kiểu
và tên đã cho để trình biên dịch có thể tiến hành biên dịch thêm mà khơng u cầu chi tiết
đầy đủ của biến.Nó chỉ có ý nghĩa tại thời điểm biên dịch, trình biên dịch phải khai báo
biến thực sự tại thời điểm liên kết chương trình. Ví dụ:
1
2
3
4

func main () {
var z float64
z = 20.0
}

5

• Khai báo động: Nó sẽ u cầu trình biên dịch diễn giải kiểu của biến dựa trên giá trị được

truyền cho nó. Ví dụ:
Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 15/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

func main () {
var z float64 // z is float64
t := 20 // t is int
}

1
2
3
4
5

Chúng ta có thể khai báo cho nhiều biến trong một dịng lệnh bằng việc sử dụng type inference
Ví dụ: Ví dụ:
1
2
3

func main () {
var a , b , c = 3 , 4 , " foo "
}


2.4.7

// a , b is int , c is string

Constants

Constants (hằng) là các giá trị cố định mà chương trình khơng thể sửa chửa khi đang thực thi.
Những giá trị này còn được gọi là literal.
Hằng có thể là bất kỳ các kiểu dư liệu nào như integer constant, floating constant, character constant, hoặc string literal.
Ví dụ về Interger literals:
1
2
3
4
5

2121 /* Legal */
2115 u /* Legal */
0 xFeL /* Legal */
078 /* Illegal : 8 is not an octal digit */
032 UU /* Illegal : cannot repeat a suffix */

Ví dụ về Floating-point literals:
1
2
3
4
5

3.14159 /* Legal */

314159 E -5 L /* Legal */
510 E /* Illegal : incomplete exponent */
210 f /* Illegal : no decimal or exponent */
. e55 /* Illegal : missing integer or fraction */

Ví dụ về String literals:
1
2
3

" hello , dear "
" hello , \
dear "

Chúng ta có thể khai báo một biến hằng bằng cách sử dụng keyword const ở tiền vị trí.
1

const variable type = value ;

Listing 7: Ví dụ về Khai báo hằng
Ví dụ:
1
2
3
4

func main () {
const LENGTH int = 10
const WIDTH int = 5
var area int


5

area = LENGTH * WIDTH
fmt . Printf ( " value of area : % d " , area )

6
7
8

// Result is 50

}

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 16/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

2.4.8

Operator

Ta có các phép tốn tử sau:
• Arithmetic Operators: Cho A bằng 10, B bằng 20

Hình 11: Các tốn tử số học

• Relational Operators: Cho A bằng 1, B bằng 2

Hình 12: Các tốn tử so sánh
• Logical Operators: Cho A bằng True, B bằng False.

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 17/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

Hình 13: Các tốn tử logic
• Bitwise Operators:

Hình 14: Các tốn tử cho Bit
• Assignment Operators:

Hình 15: Các tốn tử gán
• Miscellaneous Operators:

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 18/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính


Hình 16: Các tốn tử hổn hợp
2.4.9

Decision making trong Go

Ngôn ngữ Go cung cấp cho chúng ta nhưng dạng điều kiện như sau:
• If-statement:
1
2
3
4

if condition {
// Statements to execute if
// condition is true
}

5

Ví dụ:
1

package main

2
3

import " fmt "

4

5

func main () {

6
7
8

// taking a local variable
var v int = 700

9
10
11
12

// using if statement for
// checking the condition
if v < 1000 {

13

// print the following if
// condition evaluates to true
fmt . Printf ( " v is less than 1000\ n " )

14
15
16
17


}

18
19

fmt . Printf ( " Value of v is : % d \ n " , v )

20
21
22
23
24

}
// Result
// v is less than 1000
// value of v is : 700

25
26

• If..else statement:
1
2
3
4
5
6
7


if condition {
// Executes this block if
// condition is true
} else {
// Executes this block if
// condition is false
}

8

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 19/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

Ví dụ:
1

package main

2
3

import " fmt "

4

5

func main () {

6

// taking a local variable
var v int = 1200

7
8
9
10
11
12

// using if statement for
// checking the condition
if v < 1000 {

13

// print the following if
// condition evaluates to true
fmt . Printf ( " v is less than 1000\ n " )

14
15
16
17


} else {

18
19

// print the following if
// condition evaluates to true
fmt . Printf ( " v is greater than 1000\ n " )

20
21
22
23
24
25
26

}
}
// Result
// v is greater than 1000

27

• Nested if statement.
1

if condition1 {


2

// Executes when condition1 is true

3
4

if condition2 {

5
6

// Executes when condition2 is true

7

}

8
9

}

10

Ví dụ:
1
2

package main

import " fmt "

3
4

func main () {

5
6
7
8

// taking two local variable
var v1 int = 400
var v2 int = 700

9
10
11

// using if statement
if ( v1 == 400 ) {

12
13
14
15

// if condition is true then
// check the following

if ( v2 == 700 ) {

16
17

// if condition is true

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 20/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

// then display the following
fmt . Printf ( " Value of v1 is 400 and v2 is 700\ n " ) ;

18
19

}

20

}

21
22
23

24
25

}
// Result is
// Value of v1 is 400 and v2 is 700

26

• If...else if statement
1

if condition_1 {

2

// this block will execute
// when condition_1 is true

3
4
5
6

} else if condition_2 {

7

// this block will execute
// when condition2 is true


8
9
10
11

}
else {
// this block will execute when none
// of the condition is true

12
13
14

}

15

Ví dụ:
1
2

package main
import " fmt "

3
4

func main () {


5
6
7

// taking a local variable
var v1 int = 700

8
9
10

// checking the condition
if v1 == 100 {

11
12
13
14

// if condition is true then
// display the following */
fmt . Printf ( " Value of v1 is 100\ n " )

15
16
17

} else if v1 == 200 {
fmt . Printf ( " Value of a is 20\ n " )


18
19

} else if v1 == 300 {

20
21

fmt . Printf ( " Value of a is 300\ n " )

22
23

} else {

24
25
26
27
28
29
30

// if none of the conditions is true
fmt . Printf ( " None of the values is matching \ n " )
}
}
// Result is :
// None of the values is matching


31

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 21/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

• Switch statement: bao gồm Expression Switch và Type Switch.
– Expression Switch
switch ( boolean - expression or integral type ) {
case boolean - expression or integral type :
statement ( s ) ;
case boolean - expression or integral type :
statement ( s ) ;
/* you can have any number of case statements */
default : /* Optional */
statement ( s ) ;
}

1
2
3
4
5
6
7

8
9
10

Ví dụ:
1

package main

2
3

import " fmt "

4
5
6
7
8

func main () {
/* local variable definition */
var grade string = " B "
var marks int = 90

9
10
11
12
13

14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

switch marks {
case 90: grade = " A "
case 80: grade = " B "
case 50 ,60 ,70 : grade = " C "
default : grade = " D "
}
switch {
case grade == " A " :
fmt . Printf ( " Excellent !\ n " )
case grade == " B " , grade == " C " :

fmt . Printf ( " Well done \ n " )
case grade == " D " :
fmt . Printf ( " You passed \ n " )
case grade == " F " :
fmt . Printf ( " Better try again \ n " )
default :
fmt . Printf ( " Invalid grade \ n " ) ;
}
fmt . Printf ( " Your grade is % s \ n " , grade ) ;
}
// Result is :
// Excellent !
// Your grade is A

33

– Type Switch:
1
2
3
4
5
6
7
8
9

switch x .( type ) {
case type :
statement ( s ) ;

case type :
statement ( s ) ;
/* you can have any number of case statements */
default : /* Optional */
statement ( s ) ;
}

10

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 22/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

Ví dụ:
package main
import " fmt "
func main () {
var x interface {}

1
2
3
4
5

switch i := x .( type ) {

case nil :
fmt . Printf ( " type of x :% T " ,i )
case int :
fmt . Printf ( " x is int " )
case float64 :
fmt . Printf ( " x is float64 " )
case func ( int ) float64 :
fmt . Printf ( " x is func ( int ) " )
case bool , string :
fmt . Printf ( " x is bool or string " )
default :
fmt . Printf ( " don ’t know the type " )
}

6
7
8
9
10
11
12
13
14
15
16
17
18
19

}

// Result is :
// type of x : < nil >

20
21
22
23

2.4.10

Vòng lặp

Trong Go, chúng ta chỉ có thể dùng for để tạo vịng lặp thơng qua 2 cách sau:
• Syntax1:
1
2
3

for initia lizati on ; condition ; update {
statement ( s )
}

4

– initialization: Khởi tạo biến đếm
– condition: Điều kiện tiếp tục vòng lặp
– update: Cập nhật giá trị biến đếm sau mỗi vịng lăp
Ví dụ:
1
2


package main
import " fmt "

3
4

func main () {

5

// for loop terminates when i becomes 6
for i := 1; i <= 5; i ++ {
fmt . Println ( i )
}

6
7
8
9
10
11

}

12

Kết quả xuất ra là:

Bài Tập lớn Lập Trình Nâng Cao - CO2039


Page 23/35


Đại học Bách Khoa thành phố Hồ Chí Minh
Khoa Khoa học và Kỹ thuật Máy tính

1
2
3
4
5

1
2
3
4
5

• Syntax2:
for index ; value = < array >{
statement ( s )
}

1
2
3
4

Ví dụ:

package main
import " fmt "

1
2
3

func main () {
check := [3] string { " Huy " , " Hieu " , " Ha " }
for idx , val := range check {
fmt . Printf ( " % v \ n " , val )
}

4
5
6
7
8

}

9
10

Kết quả xuất ra là:
1
2
3

Huy

Hieu
Ha

2.4.11

Function

Hàm là một khái niệm quan trong trong Go. Chúng ta sẽ định nghĩa hàm trong Go như sau:
1
2
3
4

func function_name ( [ parameter list ] ) [ return_types ]
{
body of the function
}

Với các bộ phân của một hàm như sau:
• Func: Khai báo hàm sẽ được định nghĩa .
• Function Name: Tên của hàm được định nghĩa ( dùng để gọi hàm khi sử dụng).
• Parameters: Các tham số được truyền vào hàm.
• Return type: List các giá trị được trả về khi thực hiện hàm (có hoặc khơng).
• Function body: Chứa các statement để thực hiện hàm được định nghĩa
Ví dụ 1: Khơng trả về giá trị nào
1

package main

2

3

import " fmt "

4
5

// Sim pleFun ction prints a message

Bài Tập lớn Lập Trình Nâng Cao - CO2039

Page 24/35


×