Đề cương khóa học
1. Giới thiệu về Go
- Go (Golang) là gì?
- Lịch sử và triết lý thiết kế của Go
- Go như một ngôn ngữ lập trình web và hệ thống
- Các đặc tính chính:
- Kiểu tĩnh (Static typing)
- Đơn giản và dễ đọc
- Biên dịch nhanh
- Hỗ trợ song song (concurrency) tích hợp
- Thu gom rác (Garbage collection)
- Biên dịch đa nền tảng
- Các trường hợp sử dụng phổ biến của Go
- Lợi thế và hạn chế của Go
- So sánh Go với C/C++, JavaScript, Ruby, Python và Java
- Tầm nhìn về hệ sinh thái Go
- Tổng quan về thư viện chuẩn Go
- Go modules và quản lý phụ thuộc
- Cấu trúc của một ứng dụng Go
- Thực hành: Kiểm tra và chạy một chương trình Go đơn giản
2. Thiết lập môi trường phát triển Go
- Cài đặt Go
- Hiểu về bộ công cụ Go (Go toolchain)
- Cấu hình các biến môi trường
- Chọn IDE hoặc trình chỉnh sửa mã
- Sử dụng dòng lệnh với Go
- Tạo không gian làm việc Go
- Hiểu cấu trúc dự án Go
- Khởi tạo dự án với Go Modules
- Sử dụng
go mod init - Quản lý phụ thuộc bằng
go get - Cập nhật và kiểm tra phụ thuộc
- Định dạng mã nguồn bằng
gofmt - Chạy chương trình bằng
go run - Xây dựng ứng dụng bằng
go build - Cài đặt ứng dụng Go
- Biên dịch chéo ứng dụng
- Thực hành: Tạo và cấu hình một dự án Go bên trong container
3. Biến, Hằng số và Kiểu dữ liệu trong Go
- Khai báo biến
- Kiểu hiển thị và kiểu suy luận
- Khai báo biến ngắn gọn
- Hằng số
- Giá trị mặc định (Zero values)
- Tác dụng (Scope) và vòng đời của biến
- Các kiểu dữ liệu nguyên thủy:
- Số nguyên (Integers)
- Số thực (Floating-point numbers)
- Số phức (Complex numbers)
- Giá trị logic (Booleans)
- Chuỗi (Strings)
- Chuyển đổi kiểu dữ liệu
- Xử lý Unicode và UTF-8
- Runes và bytes
- Gán nhiều biến cùng lúc
- Hiểu về độ an toàn kiểu dữ liệu
- Bài tập: Xây dựng một chương trình xử lý dữ liệu dòng lệnh nhỏ
4. Toán tử và Biểu thức
- Toán tử số học
- Toán tử so sánh
- Toán tử logic
- Toán tử gán
- Tăng và giảm (Increment and decrement)
- Ưu tiên toán tử
- Xử lý các phép tính số nguyên và số thực
- Tránh các lỗi chuyển đổi kiểu dữ liệu phổ biến
- Bài tập: Thực hiện các phép tính và logic kiểm tra hợp lệ
5. Ngày giờ và Định dạng
- Sử dụng gói
time - Tạo và thao tác với ngày
- Lấy thời gian hiện tại
- Múi giờ và địa điểm
- Phân tích ngày giờ
- Định dạng ngày giờ
- Tính toán khoảng thời gian
- Xử lý Unix timestamps
- Xử lý timeout
- Bài tập: Thêm dấu thời gian và tính toán khoảng thời gian vào ứng dụng
6. Mảng, Slice, Map và Struct
Mảng (Arrays)
- Khai báo mảng
- Khởi tạo mảng
- Lặp qua mảng
- Mảng nhiều chiều
Slice
- Hiểu về sự khác biệt giữa Slice và Mảng
- Tạo Slice
- Thêm phần tử (Appending elements)
- Sao chép Slice
- Chiều dài và dung lượng của Slice
- Cắt Slice từ Slice
- Những bẫy phổ biến khi sử dụng Slice
Map
- Tạo Map
- Thêm và xóa mục nhập
- Kiểm tra sự tồn tại của key
- Lặp qua Map
- Map chứa dữ liệu phức tạp
Struct
-
Định nghĩa cấu trúc (structures)
-
Các trường (fields) trong Struct
-
Khởi tạo Struct
-
Struct lồng nhau (Nested structs)
-
Struct ẩn danh (Anonymous structs)
-
Phương thức của Struct (Struct methods)
-
Các tag JSON cho Struct
-
Thực hành: Mô hình hóa người dùng, sản phẩm và dữ liệu ứng dụng bằng cách sử dụng structs, slices và maps
7. Logic Điều kiện và Vòng lặp
- Câu lệnh
if elsevàelse if- Khai báo biến trong điều kiện
- Vòng lặp
for - Vòng lặp vô hạn
- Điều kiện vòng lặp
breakvàcontinue- Lặp với
range - Vòng lặp lồng nhau
- Câu lệnh
switch - Switch dựa trên biểu thức
- Nhiều trường hợp (cases)
- Trường hợp mặc định (default cases)
- Switch kiểu dữ liệu (Type switches)
- Bài tập: Thực hiện logic kiểm tra hợp lệ và xử lý cho ứng dụng
8. Hàm (Functions)
- Định nghĩa hàm
- Tham số của hàm
- Giá trị trả về
- Nhiều giá trị trả về
- Giá trị trả về đặt tên
- Hàm có tham số biến đổi (Variadic functions)
- Hàm ẩn danh
- Giá trị là hàm
- Closures
- Đệ quy (Recursion)
- Truyền hàm như tham số
- Hàm trả về lỗi
- Thiết kế các hàm nhỏ, tái sử dụng được
- Bài tập: Tái cấu trúc mã nguồn hiện tại thành các hàm tái sử dụng
9. Con trỏ và Khái niệm Bộ nhớ
- Con trỏ là gì?
- Toán tử lấy địa chỉ và giải tham chiếu (dereference)
- Con trỏ và tham số hàm
- Con trỏ nhận (Pointer receivers)
- Con trỏ đến structs
- Con trỏ Nil
- Khi nào nên sử dụng con trỏ
- Ngữ nghĩa giá trị và tham chiếu
- Hiểu về quản lý bộ nhớ và thu gom rác của Go
- Các lỗi con trỏ phổ biến
- Thực hành: Sửa đổi dữ liệu ứng dụng bằng cách sử dụng con trỏ
10. Tạo ứng dụng Web bằng Go
- Tổng quan về khả năng web của Go
- Giới thiệu gói
net/http - Tạo máy chủ HTTP
- Yêu cầu và phản hồi HTTP
- Các phương thức HTTP
- URL yêu cầu và tham số truy vấn
- Header HTTP
- Mã trạng thái HTTP
- Cơ bản về định tuyến (Routing)
- Tạo handlers
- Xử lý dữ liệu form
- Phục vụ các tệp tĩnh (static files)
- Làm việc với các mẫu HTML (HTML templates)
- Biến và cấu trúc điều khiển trong template
- Tổ chức một ứng dụng web
- Thực hành: Xây dựng một máy chủ web Go cơ bản
11. Xây dựng dịch vụ Web RESTful
- Cơ bản về kiến trúc REST
- Thiết kế các endpoint API
- GET, POST, PUT, PATCH và DELETE
- Làm việc với JSON
- Mã hóa và giải mã JSON
- Kiểm tra hợp lệ yêu cầu
- Mã trạng thái HTTP
- Phản hồi lỗi
- Tham số truy vấn và tham số đường dẫn
- Cấu trúc phản hồi API
- Tách handlers khỏi logic kinh doanh
- Thực hành: Xây dựng một REST API CRUD
12. Go Runtime, Biên dịch và Xây dựng Dự án
- Hiểu về trình biên dịch Go
- Quy trình build của Go
go rungo buildgo installgo test- Các cờ build (Build flags)
- Cấu hình theo môi trường
- Xây dựng cho các hệ điều hành và kiến trúc khác nhau
- Sản xuất các binary độc lập
- Quản lý cấu hình ứng dụng
- Bài tập: Biên dịch ứng dụng cho nhiều nền tảng
13. Làm việc với Tệp và Web
- Mở và đóng tệp
- Đọc tệp
- Viết tệp
- Tạo thư mục
- Metadata của tệp
- I/O có đệm (Buffered I/O)
- Làm việc với luồng (streams)
- Đọc và viết tệp JSON
- HTTP clients
- Thực hiện yêu cầu HTTP ra bên ngoài
- Xử lý lỗi của HTTP client
- Timeouts và hủy bỏ (cancellation)
- Xử lý phản hồi API
- Thực hành: Lấy dữ liệu từ một API bên ngoài và lưu trữ cục bộ
14. Xử lý Lỗi và Gỡ lỗi
- Cách tiếp cận lỗi của Go
- Trả về lỗi từ các hàm
- Kiểm tra lỗi
- Tạo lỗi tùy chỉnh (custom errors)
- Bọc lỗi (Wrapping errors)
- Thêm ngữ cảnh vào lỗi
errors.Isvàerrors.As- Panic và recovery
- Khi nào nên sử dụng
panic - Gỡ lỗi các vấn đề phổ biến của Go
- Ghi log hoạt động của ứng dụng
- Sử dụng các công cụ gỡ lỗi Go
- Bài tập: Chẩn đoán và sửa các lỗi ứng dụng được cố tình tạo ra
15. Interfaces và Trừu tượng
- Interface là gì?
- Thực hiện interface ngầm định
- Định nghĩa interfaces
- Giá trị interface
- Interfaces rỗng /
any - Khẳng định kiểu (Type assertions)
- Switch kiểu dữ liệu (Type switches)
- Thực hiện qua con trỏ so với giá trị
- Thiết kế các interface nhỏ
- Đảo ngược phụ thuộc (Dependency inversion)
- Sử dụng interfaces để test
- Giảm độ kết hợp của ứng dụng
- Thực hành: Giới thiệu interfaces vào ứng dụng web mẫu
16. Packages và Tổ chức Dự án
- Tạo packages
- Quy ước đặt tên package
- Định danh xuất bản và không xuất bản (Exported and unexported identifiers)
- Nhập packages (Importing packages)
- Khởi tạo package
- Tổ chức các lớp ứng dụng
- Các package nội bộ (Internal packages)
- Quản lý phụ thuộc bằng Go Modules
- Định phiên ngữ nghĩa (Semantic versioning)
- Sử dụng các package của bên thứ ba
- Tránh phụ thuộc vòng tròn
- Thiết kế dự án Go dễ bảo trì
- Bài tập: Tái cấu trúc ứng dụng thành các package riêng biệt
17. Song song (Concurrency) với Goroutines
- Song song là gì?
- Goroutines
- Bắt đầu goroutines
- Hiểu về thực thi song song nhẹ (lightweight concurrent execution)
- Các thách thức đồng bộ hóa
- Trạng thái chia sẻ
- Điều kiện tranh chấp (Race conditions)
- Sử dụng
sync.WaitGroup - Mutexes và mutex đọc/viết
- Các thao tác nguyên tử (Atomic operations)
- Thực hành: Chuyển đổi một tác vụ tuần tự thành xử lý song song
18. Kênh (Channels)
- Hiểu về kênh (channels)
- Gửi và nhận giá trị
- Kênh có đệm so với kênh không đệm
- Hành vi chặn (Blocking behavior)
- Đóng kênh
- Lặp qua kênh với range
- Kênh định hướng (Directional channels)
- Giao tiếp dựa trên kênh
- Câu lệnh Select
- Timeouts và hủy bỏ
- Mô hình worker-pool
- Mô hình Producer/consumer
- Thực hành: Xây dựng một hệ thống worker song song
19. Context và Quản lý Yêu cầu
- Tại sao context quan trọng trong ứng dụng web
context.Context- Context phạm vi yêu cầu (Request-scoped context)
- Hủy bỏ (Cancellation)
- Hạn chót (Deadlines)
- Timeouts
- Truyền context qua các lớp ứng dụng
- Hủy bỏ các thao tác database hoặc HTTP
- Tránh sử dụng sai context
- Bài tập: Thêm tính năng hủy yêu cầu và timeouts vào ứng dụng web
20. Kiểm thử (Testing) ứng dụng Go
- Tại sao kiểm thử tự động lại quan trọng
- Viết unit tests
- Gói
testing - Hàm test
- Quy ước đặt tên test
- Test dựa trên bảng (Table-driven tests)
- Test lỗi
- Test các HTTP handlers
- Máy chủ test HTTP
- Test fixtures
- Phạm vi phủ test (Test coverage)
- Benchmark
- Test mẫu (Example tests)
- Test interfaces với mocks hoặc fakes
- Thực hành: Tạo một bộ test cho ứng dụng mẫu
21. Tối ưu Hiệu năng
- Hiểu về hiệu năng ứng dụng Go
- Xác định điểm nghẽn (bottlenecks)
- Hiệu năng CPU so với bộ nhớ
- Các cấu trúc dữ liệu hiệu quả
- Giảm phân bổ không cần thiết
- Chuỗi, bytes và buffers
- Quản lý Goroutines
- Tránh sự song song quá mức
- Chiến lược caching
- Các yếu tố về database và mạng
- Profiling ứng dụng
- Benchmark và test hiệu năng
- Sử dụng các công cụ profiling của Go
- Bài tập: Profiling và tối ưu hóa một ứng dụng kém hiệu năng cố tình tạo ra
22. Bảo mật và Thực hành Xây dựng Ứng dụng Web Bền vững
- Kiểm tra hợp lệ đầu vào của người dùng
- Xử lý an toàn các yêu cầu HTTP
- Phòng chống các lỗ hổng web phổ biến
- Xử lý lỗi an toàn
- Khái niệm xác thực và phân quyền
- Quản lý bí mật (secrets) và cấu hình
- Giao tiếp HTTP an toàn
- Tránh lưu thông tin nhạy cảm trong logs
- Quản lý phụ thuộc và cập nhật
- Hạn chế tài nguyên và timeout yêu cầu
- Bài tập: Rà soát và tăng cường bảo mật cho API mẫu
23. Ghi Log và Khả năng Quan sát Ứng dụng
- Cơ bản về ghi log
- Ghi log có cấu trúc (Structured logging)
- Cấp độ log
- Ghi log yêu cầu
- Ghi log lỗi
- Tương quan và ID yêu cầu
- Giám sát hành vi ứng dụng
- Các chỉ số cơ bản (Basic metrics)
- Các endpoint kiểm tra sức khỏe (Health-check endpoints)
- Chẩn đoán các vấn đề sản xuất
- Thực hành: Thêm ghi log có cấu trúc và kiểm tra sức khỏe
24. Container hóa ứng dụng Go
- Tại sao nên sử dụng container?
- Ứng dụng Go và container hóa
- Viết Dockerfile
- Xây dựng đa giai đoạn (Multi-stage builds)
- Xây dựng image runtime tối thiểu
- Quản lý cấu hình thông qua biến môi trường
- Mạng container
- Mở các cổng (ports) của ứng dụng
- Chạy ứng dụng trong container
- Test ứng dụng đã container hóa
- Thực hành: Đóng gói ứng dụng Go mẫu thành một container sẵn sàng cho sản xuất
25. Triển khai (Deployment)
- Chuẩn bị ứng dụng cho môi trường sản xuất
- Xây dựng các binary sản xuất
- Cấu hình môi trường
- Triển khai dựa trên container
- Kiến trúc triển khai
- Reverse proxies
- Các cân nhắc về HTTPS/TLS
- Kiểm tra sức khỏe ứng dụng
- Đóng êm dịu (Graceful shutdown)
- Xử lý tín hiệu hệ điều hành
- Mở rộng ứng dụng web Go
- Mở rộng ngang so với mở rộng dọc
- Gỡ lỗi cơ bản trong triển khai
- Thực hành: Triển khai ứng dụng web mẫu
26. Dự án Tốt nghiệp (Capstone): Ứng dụng Web Go Hoàn chỉnh
Người tham gia kết hợp các khái niệm bằng cách phát triển một ứng dụng hoàn chỉnh.
Dự án có thể bao gồm:
- Khởi tạo dự án với Go Modules
- Tổ chức packages
- Định tuyến HTTP
- Các endpoint REST API
- Xử lý yêu cầu và phản hồi JSON
- Kiểm tra hợp lệ đầu vào
- Xử lý lỗi
- Interfaces
- Xử lý song song
- Giao tiếp với API bên ngoài
- Lưu trữ tệp hoặc database
- Test tự động
- Ghi log
- Cân nhắc về hiệu năng
- Container hóa
- Cấu hình sản xuất
- Triển khai
27. Rà soát và Thực hành Tốt nhất
- Rà soát cú pháp cốt lõi của Go
- Quy ước viết mã Go
- Viết Go theo đúng chuẩn (idiomatic Go)
- Giữ cho mã nguồn đơn giản
- Thiết kế package hiệu quả
- Thực hành tốt nhất cho xử lý lỗi
- Nguyên tắc thiết kế interface
- Thực hành tốt nhất cho concurrency
- Chiến lược test
- Cân nhắc về hiệu năng
- Khả năng bảo trì và dễ đọc
- Các lỗi phổ biến do lập trình viên Go mới mắc phải
- Các phương pháp tiếp cận được khuyến nghị để tiếp tục phát triển Go
28. Kết luận
- Rà soát các khái niệm chính
- Rà soát ứng dụng web đã hoàn thành
- Câu hỏi và thảo luận
- Gỡ lỗi các kịch bản thực tế phổ biến
- Các bước tiếp theo được khuyến nghị cho phát triển Go
- Các thư viện Go bổ sung và tài nguyên hệ sinh thái
- Cơ hội bổ sung để xây dựng các dịch vụ Go chuẩn sản xuất
Yêu cầu
- Hiểu biết về các nguyên tắc lập trình chung
Đối tượng tham gia
- Trình phát triển (Developers)
Đánh giá (5)
Giảng viên đã chứng minh mình là chuyên gia về chủ đề này, điều mà tôi không bao giờ coi là đương nhiên. Ông đã cung cấp những thông tin rất hữu ích về tiêu chuẩn ngành.
Giuseppe
Khóa học - Learning Go Programming
Dịch thuật bằng máy
Tôi rất thích số lượng bài tập thực hành mà chúng tôi đã làm. Cá nhân tôi học tốt nhất khi thực hành, nên việc Francesco chuẩn bị nhiều bài tập thực hành là rất hữu ích. Tôi gặp khó khăn trong việc hiểu một số khái niệm từ các slide, nhưng khi tự tay thực hiện và áp dụng các tính năng chính của ngôn ngữ, nó giúp tôi hiểu rõ hơn.
Adam Fitzhugh - OpticoreIT
Khóa học - Learning Go Programming
Dịch thuật bằng máy
thái độ, khả năng của huấn luyện viên trong việc hỗ trợ và duy trì các câu hỏi khó hơn một chút.
Andrei Mihai - Viasat
Khóa học - Learning Go Programming
Dịch thuật bằng máy
Kiến thức sâu rộng của Radu và cách điều chỉnh tốc độ phù hợp với tôi.
Adeel Ahmad - Coefficient Data Ltd
Khóa học - Learning Go Programming
Dịch thuật bằng máy
Sự linh hoạt của giảng viên. Đã thực sự điều chỉnh khóa học phù hợp với nhu cầu cụ thể của chúng tôi.
Daniel Kurner - Daimler TSS
Khóa học - Learning Go Programming
Dịch thuật bằng máy