Giai đoạn 3 - Linux và DevOps
Chào mừng quý vị và các bạn đã đến với ngày thứ 7 của hành trình 90 ngày cùng DevOps. Từ ngày hôm nay, các nội dung sẽ không chỉ gói gọn trong những dòng chữ lý thuyết suông, mà thêm vào đó, các nội dung thực hành sẽ được triển khai một cách thường xuyên và liên tục hơn.
Trong nội dung của Giai đoạn 2 này, chúng ta sẽ đến với câu chuyện về những ngôn ngữ lập trình thường được các “Kỹ sư DevOps” sử dụng trong quá trình làm việc. Câu hỏi to đùng được đặt ra đó là: Liệu rằng 1 kỹ sư DevOps có cần phải học lập trình hay không? Nếu có, người đó nên chọn ngôn ngữ lập trình nào để học đây?
Nếu bạn cũng tò mò về câu trả lời, vậy thì hãy sẵn sàng và bắt đầu thôi! 🚌
Nguồn: AWAI
Ngày 7 - Tại sao phải học lập trình?
Học lập trình - Tại sao không?
Nếu bạn muốn trở thành một kỹ sư DevOps giỏi, nhất định phải học lập trình. Nhưng không phải học để giỏi hoàn toàn. Việc học lập trình ở đây là để đọc và hiểu được đoạn mã nguồn đó dành cho tính năng gì, từ đó có thể triển khai và cải thiện những thứ khác liên quan đến ứng dụng đang thực hiện.
Nếu để chọn một ngôn ngữ lập trình phù hợp, tôi khuyến nghị Go hoặc Python. Vì đơn giản, có rất nhiều công cụ DevOps được viết bằng Python hoặc Go, trong đó Kubernetes, Docker, Grafana và Prometheus đều được viết bằng Go. Việc học hai ngôn ngữ này sẽ giúp ích rất nhiều trong quá trình làm việc sau này.
Một điều quan trọng cần phải học nữa là cách tương tác, làm việc với các công cụ DevOps, bằng một số công cụ như Terraform hoặc Ansible. Ngoài ra, chúng ta vào cuối giai đoạn này sẽ học cách biến mọi thứ thành hiện thực bằng việc xây dựng các tập tin cấu hình viết bằng YAML.
Nguồn: VTI TechBlog
Liệu không học có ổn không?
Trong thực tế, công việc của một kỹ sư DevOps sẽ thường là khắc phục sự cố về hiệu năng của ứng dụng, và mỗi ứng dụng sẽ có một bộ khung ngôn ngữ và công cụ riêng cần được sử dụng. Không nhất thiết thứ bạn cần biết là thứ bạn cần học - JavaScript sẽ phù hợp hơn cho một ứng dụng sử dụng NodeJS là bộ khung cho phần xử lý (backend) của ứng dụng thay vì Go hay Python.
Nguồn: Ositcom
Go - Tại sao lại là nó?
Go là ngôn ngữ lập trình tiếp theo cho DevOps và trở thành ngôn ngữ lập trình rất phổ biến trong những năm gần đây. Mặc dù đứng hạng 13 trong bảng xếp hạng năm 2023 của StackOverflow, trong khi Python đứng thứ 3, thế nhưng không vì thế mà Go đánh mất sức hút thật sự của mình.
Nguồn: Monterail
Xây dựng ứng dụng bằng Go
Một điểm đặc thù với Python chính là: Đây là một ngôn ngữ ở dạng thông dịch, đồng nghĩa với việc bản thân lập trình viên sẽ không cần tự biên dịch chương trình ra mã máy, giúp tiết kiệm thời gian đối với các tác vụ quan trọng.
Trong khi đó, Go lại là ngôn ngữ dạng biên dịch, không khác C++ hay Java là mấy. Điểm quan trọng cần lưu ý là tốc độ biên dịch chương trình ra mã máy của Go là tương đối nhanh, do đó sẽ là tối ưu hơn nếu bạn từng làm quen với C/C++ hay Java trong một khoảng thời gian trước đây.
DevOps với Go và Python
Các chương trình Go được liên kết tĩnh, điều này có nghĩa khi biên dịch một chương trình viết bằng Go, mọi thứ đều được chứa trong một tệp thực thi nhị phân duy nhất và không cần cài đặt thêm các thư viện bên ngoài trên các máy chủ. Điều này giúp cho việc triển khai các chương trình viết bằng Go dễ dàng hơn. Với Python, chúng ta có các ứng dụng sử dụng các thư viện bên ngoài, đồng nghĩa với việc cần phải đảm bảo các thư viện được cài đặt trên máy chủ trước khi chạy chương trình.
Go là một ngôn ngữ không phụ thuộc hệ điều hành, có nghĩa là bạn có thể tạo ra các tập tin thực thi cho tất cả các hệ điều hành như Linux, Windows, macOS, v.v… Python không dễ dàng làm được điều tương tự.
Go là một ngôn ngữ có hiệu năng cao, có khả năng biên dịch, thời gian chạy nhanh và sử dụng ít tài nguyên hơn đặc biệt so với Python. Nhiều hệ thống tối ưu đã được viết bằng Go đem đến hiệu suất rất cao (chi tiết có trong phần tài liệu tham khảo)
Không giống như Python thường yêu cầu sử dụng thư viện của bên thứ ba để triển khai một chương trình cụ thể, Go có một kho thư viện tiêu chuẩn với hầu hết các chức năng cần thiết cho DevOps được tích hợp sẵn. Nó bao gồm xử lý tệp, dịch vụ web HTTP, xử lý JSON, hỗ trợ cho xử lý đồng thời và song song (concurency, parallelism) cũng như kiểm thử tích hợp (built-in testing).
Điều này không có nghĩa là chúng ta bỏ qua Python như một lựa chọn thứ hai. Người ta nói rằng một khi học được ngôn ngữ lập trình đầu tiên, việc tiếp nhận các ngôn ngữ lập trình khác cũng trở nên dễ dàng hơn.
Ngày 8 - Khởi động với Go
Đây là ngày thứ 8 của chặng hành trình, và ngày này sẽ không có bất kỳ tài liệu tham khảo nào, bởi lẽ, chúng ta sẽ sử dụng chung một bộ tài liệu đã có từ ngày 07 trở đi.
Còn bây giờ, bắt đầu chuyến hành trình nào! 🚘
Cài đặt Go và Visual Studio Code 🛠
Trước hết, ta cài đặt một IDE (Môi trường Phát triển tích hợp) cho việc lập trình lý tưởng. Ở đây tôi chọn Visual Studio Code.
Nguồn: VSCode
Tiếp theo, ta cài đặt Go vào máy tính của mình. Truy cập đường dẫn này để tải bộ cài tương ứng với hệ điều hành đang sử dụng.
Nguồn: Golang
Bắt đầu quá trình thực hiện (ở quá trình này, nếu trước đó đã cài phiên bản cũ, hệ thống sẽ gỡ bỏ và cài đặt phiên bản mới):
Sau khi cài đặt xong, mở Visual Studio Code, sau đó mở Command Prompt (Trình nhắc lệnh) để kiểm tra phiên bản đã cài đặt.
Tiếp theo, ta kiểm tra vị trí cho môi trường làm việc với Go. Nếu bạn muốn làm việc ở một thư mục khác, ta phải thay đổi bằng cách thêm thư mục cần dùng vào biến GOPATH.
Xin chào thế giới!!! Xin chào Việt Nam!!!
Tạo tiếp ba thư mục pkg
, bin
, src
trong thư mục ta xác định GOPATH và thư mục con hello
trong
src
.
Trong thư mục hello
, tạo một file có tên là main.go
.
Sau đó, đưa nội dung này vào bên trong tập tin.
Kiểm tra xem chương trình có chạy đúng như kỳ vọng hay không. Nếu chương trình đã chạy đúng kỳ vọng, chúng ta sẽ xuất chương trình ra một tập tin thực thi khác.
Trong một số trường hợp, Microsoft Defender sẽ đánh dấu tập tin .exe là mã độc (mặc dù nội dung không chứa mã độc). Lúc này, việc cần làm là đưa thư mục chứa mã nguồn vào trạng thái loại trừ.
Dưới đây là một hình ảnh nếu như đưa vào loại trừ thành công (lấy từ bản gốc của series).
Nếu đem tập tin thực thi (.exe) đó sang máy khách chạy, kết quả sẽ là tương tự.
Hoàn thành bài tập ngày 08. Xin chào thế giới, xin chào Việt Nam!!!
Ngày 9 - Phân tích mã nguồn
Xin chào mọi người, cuối cùng cũng đã đến lúc chúng ta sẽ phân tích đoạn mã nguồn Xin chào Việt Nam trong ngày thứ 8 vừa rồi. Nếu bạn đã sẵn sàng, hãy bắt đầu thôi!
Cách Go hoạt động
Go cũng giống như C++ hay Java, đều là ngôn ngữ theo dạng biên dịch - chương trình cần phải được dịch ra mã máy (mã máy là mã nhị phân - hệ 2 chữ số 0 và 1) để máy tính có thể hiểu và chạy được.
Trong ngày 8 chúng ta sử dụng một câu lệnh: go build main.go
. Đây là cách chúng ta biên
dịch chương trình.
Package - Gói 📦
Gói là tập hợp các tập tin mã nguồn trong cùng thư mục được biên dịch cùng nhau. Khi viết một chương trình Go phức tạp với nhiều thư mục hơn, mỗi thư mục khi được biên dịch sẽ tạo thành một gói.
Gói là một cách giúp ta tái sử dụng mã nguồn mà không cần viết lại từ đầu. Điều này giúp chúng ta dễ dàng quản lý và tiết kiệm thời gian, công sức xây dựng ứng dụng hơn. Giả sử nếu chúng ta tạo ra một máy tính cầm tay bằng Go, các gói liên quan đến các hàm tính toán khi được nhập (import) vào chương trình sẽ giúp giảm được rất nhiều thời gian cho việc phải xây dựng lại từ đầu.
Phân tích lời chào 👋
Đây là đoạn mã nguồn chúng ta sử dụng trong ngày 8.
Chúng ta bắt đầu phân tích từng dòng của đoạn mã nguồn này.
Dòng 1
Rõ ràng ta có thể nhận diện được gói mà chương trình thuộc về có tên là main
. Đây là
đầu vào của chương trình, chứa các tập tin mã nguồn viết bằng Go sử dụng cho hàm chính của
chương trình.
Tất nhiên ta sẽ có thể chọn tên các gói khác dưới dạng package <name>
cho chương trình.
Dòng 5
Ở mỗi chương trình, cần xác định vị trí hàm chính chương trình sẽ chạy, đây là nơi mà máy sẽ theo dõi và bắt đầu vận hành ứng dụng.
Hàm là một đoạn mã nguồn có nhiệm vụ thực hiện một tính năng bất kỳ, có thể sử dụng xuyên suốt chương trình.
Dòng 3 và 6
Dòng 3 cho thấy, fmt
là một thư viện chuẩn của Go, được thêm vào để sử dụng được hàm
Println()
tại dòng 6 của chương trình. Hệ thống thư viện chuẩn của Go như đã đề cập
ở ngày 8 có rất nhiều mà chúng ta có thể sử dụng, tiết kiệm rất nhiều nguồn lực cho chúng ta.
Để xem trọn vẹn những thư viện chuẩn có sẵn, truy cập vào đây.
Ở dòng 6, hàm Println()
cho phép in những dữ liệu về đầu ra chuẩn (màn hình/cửa sổ
lệnh) để thông báo chương trình chạy thành công. Bạn có thể thay đổi thử thông điệp giữa
hai dấu ""
và chạy lại chương trình bằng câu lệnh sau để xem kết quả.
Tóm tắt
- Dòng 1: Tập tin mã nguồn sẽ ở trong gói tên
main
, và phải dùng tên này, vì nó chứa đầu vào chương trình. - Dòng 3: Để sử dụng hàm
Println()
trong chương trình, cần thêm góifmt
. - Dòng 5: Đầu vào chính của chương trình, máy chạy hàm chính tại dòng này.
- Dòng 6: In ra màn hình câu “Xin chào Việt Nam!”.
Hoàn thành phân tích ngày 9.
Ngày 10 - Không gian làm việc Go
Chúng ta đã đi qua về mã nguồn của chương trình “Xin chào Việt Nam” ở ngày 8 và ngày 9. Ngày hôm nay, xin gửi lời chào đến quý độc giả, và chào mừng quý vị đến với “Không gian làm việc Go”.
Hãy sẵn sàng, và bắt đầu hành trình thôi!!! 🛺
Biến môi trường (GOPATH)
Bạn có còn nhớ, khi cài đặt Go vào máy, chúng ta chọn các tính năng mặc định cho hệ thống,
và tạo các thư mục chứa mã nguồn Go ở vị trí của biến môi trường GOPATH
đã được
lựa chọn. Tất nhiên, ta có thể thay đổi biến môi trường này, nhưng trước hết, hãy kiểm
tra xem biến này đang chứa đường dẫn về thư mục nào.
Sau đó chúng ta có ba thư mục được tạo ra.
Thư mụcbin
- gopls.exe
- staticcheck.exe
- …
Thư mụcpkg
Thư mụcmod/
- …
Thư mụcsumdb/
- …
Thư mụcsrc
Thư mụchello
- main.go
src
: Nơi lưu trữ mã nguồn chương trình. Nơi đây quản lý các gói chứa tên miền cho tất cả kho lưu trữ Go của mình.pkg
: Nơi chứa các gói đã/đang được cài đặt trong chương trình. Điều này giúp tăng tốc độ biên dịch chương trình khi chỉ cần kiểm tra phiên bản của các gói thay vì tải về lại từ đầu.bin
: Nơi chứa các tập tin nhị phân đã được biên dịch.
Chương trình “Xin chào Việt Nam” này không phải là một thứ quá phức tạp - nếu cần có góc nhìn thực tế hơn, hãy nhìn vào sơ đồ sau.
Nguồn: GoChronicles
Tại website nguồn, mọi người có thể theo dõi chi tiết và tìm hiểu nguyên nhân vì sao cũng như cách thức cây thư mục này được tổ chức. Bên cạnh đó, mọi người có thể đi sâu hơn vào từng thư mục cụ thể mà ở đây chưa đề cập đến.
Biên dịch và chạy chương trình
Ở ngày 9, chúng ta đã biên dịch chương trình, và bây giờ là lúc chúng ta đi sâu hơn vào cách thức Go hoạt động.
Để chạy chương trình, cần biên dịch nó. Để biên dịch chương trình, ta có thể sử dụng một công cụ cũng có tên là Go (hay gọi là Go CLI). Ta cũng có thể cài đặt và sử dụng thêm các công cụ khác của bên thứ ba bên cạnh bộ cài chuẩn của Go.
Mở cửa sổ dòng lệnh, gõ lệnh sau và ta sẽ thấy loạt hướng dẫn tương ứng.
Chúng ta đã dùng hai câu lệnh màu vàng trong ngày 8. Ba câu lệnh màu xanh lá chính là ba cách để biên dịch chương trình.
go run
: Câu lệnh biên dịch và chạy trực tiếp góimain
bao gồm các tập tin Go chỉ định trên cửa sổ lệnh. Câu lệnh này cho phép biên dịch ra một tập tin thực thi ra một thư mục tạm thời.go build
: Câu lệnh biên dịch các gói và thư viện liên quan tại thư mục hiện thời. Nếu mã nguồn Go có một góimain
, câu lệnh này sẽ tạo và đặt tập tin thực thi ngay tại chính thư mục đó. Nếu không, tập tin thực thi này sẽ nằm ở thư mụcpkg
, có thể nhập vào và sử dụng bởi các chương trình khác. Câu lệnh còn giúp biên dịch chương trình ra các nền tảng Hệ điều hành được hỗ trợ bởi Go.go install
: Tương tự như câu lệnh số 2, tuy nhiên tập tin thực thi nằm trong thư mụcbin
.
Hết nội dung ngày 10. Hy vọng rằng mọi người đã đón nhận được phần nào nội dung hôm nay.
Với những cố gắng thường xuyên và liên tục, mình hy vọng rằng tất cả mọi người sẽ đồng hành và ủng hộ bằng cách xem những nội dung này, và thêm phần Tham khảo ngay dưới đây, vì mình đã tóm gọn lại những nội dung phù hợp nhất để mọi người có thể nghiên cứu và tự học về Golang.
Ngày 11 - Biến/Hằng/Kiểu dữ liệu trong Go
Chào mừng mọi người đến với ngày 11 của hành trình này. Sau khi chúng ta có được những kiến thức đầu tiên về Golang, giờ là lúc đi sâu hơn vào các thuật ngữ quan trọng: Biến số, Hằng số và Kiểu dữ liệu được sử dụng trong Go ra sao? Cùng tìm hiểu nhé! ⭐
Biến và hằng số trong Go
Okay, để lên ý tưởng cho cuộc vui này, mình nghĩ 1 ứng dụng web đơn giản viết bằng Go sẽ phù hợp với tất cả chúng ta. Ứng dụng này sẽ thông báo sô ngày hoàn thành hành trình cho mọi người biết.
Sau đây là một số thông tin cần nắm:
- Biến được dùng để lưu giá trị
- Biến được sử dụng trong suốt chương trình và có thể thay đổi tùy thuộc vào yêu cầu.
Để khai báo biến, chúng ta sẽ sử dụng từ khóa. Từ khóa này cũng sẽ nằm trong hàm chính
(main
) của chương trình. Mọi người có thể xem các từ khóa của Go tại
đây.
Như vậy bây giờ, đoạn code của chúng ta sẽ bắt đầu như thế này.
Và đây là kết quả khi chạy chương trình.
Chúng ta cũng biết hành trình này về cơ bản kéo dài 90 ngày, nhưng không đồng nghĩa nó sẽ không kéo dài tới 100 ngày. Do đó, số ngày của hành trình cần được cố định, người ta gọi là hằng. Hằng số khác với biến là xuyên suốt chương trình, giá trị hằng số sẽ không thay đổi.
Khi thêm hằng số vào trong mã nguồn cũng như điều chỉnh, ta có chương trình sau.
Kết quả sẽ như thế này.
Cuối cùng, chúng ta sẽ thêm số ngày hoàn thành dưới dạng một biến số (vì hành trình vẫn kéo dài). Hành trình kéo dài, nghĩa là mã nguồn này vẫn còn thay đổi. Dưới đây là bản cập nhật và kết quả sau khi chạy chương trình.
Một phiên bản khác của chương trình cho phép bạn sử dụng hàm printf
thay vì println
để in ra màn hình, tương tự như C. Ta sẽ thay thế bằng %v
để chỉ biến số và \n
để
xuống dòng.
Biến số cũng có thể được khai báo đơn giản hơn mà không cần sử dụng từ khóa là var
.
Kiểu dữ liệu trong Go
Ở ví dụ trên, chúng ta không cần khai báo kiểu dữ liệu cho biến hay hằng, bởi Go đủ thông minh để nhận diện được điều này. Nhưng câu chuyện sẽ rẽ sang hướng khác, nếu có dữ liệu đầu vào từ người dùng.
Chúng ta đã sử dụng kiểu dữ liệu chuỗi và số nguyên trong mã nguồn. Kiểu số nguyên cho số ngày và kiểu chuỗi cho tên hành trình.
Một điều quan trọng cần lưu tâm là mỗi kiểu dữ liệu thực hiện một vai trò khác nhau và sẽ có cách xử lý khác nhau trên mã nguồn. Thí dụ, số nguyên có thể làm phép tích (nhân) được nhưng không thể nhân hai chuỗi với nhau được.
Các kiểu dữ liệu
Có bốn kiểu dữ liệu chính trong Go.
- Cơ bản: Bao gồm Số, Chuỗi và Nhị phân (Numbers, Strings, Booleans)
- Tổng hợp (Aggregate): Bao gồm Mảng và Cấu trúc (Arrays, Structs)
- Tham chiếu (Reference): Bao gồm Con trỏ, Lát cắt, Bản đồ, Hàm và Kênh (Pointers, Slices, Maps, Functions, Channels)
- Giao diện - Interface
Kiểu dữ liệu là khái niệm quan trọng trong lập trình, chỉ định định dạng cũng như kích thước của các biến.
Kiểu cơ bản
Có ba kiểu cơ bản được dùng trong Go.
bool
: Nhị phân, nhận hai giá trị đúng (true
) hoặc sai (false
)Numeric
: Kiểu số, bao gồm số nguyên, số thực và số phứcstring
: Chuỗi ký tự
Hãy truy cập vào đây để biết thêm về các kiểu dữ liệu trong Go: Golang by Examples
Để khai báo kiểu dữ liệu ta sẽ thực hiện như sau.
Do Go tự suy luận biến có giá trị, ta sẽ in ra màn hình các giá trị như sau.
Đối với kiểu Numeric
có ba kiểu số khác nhau.
int
: Số nguyên có dấuuint
: Số nguyên dương không dấufloat
: Số thực (dấu phẩy động)
Hết nội dung ngày 11. Xin chào tạm biệt! 👋
Ngày 12 - Đầu vào và Con trỏ
Xin chào mọi người. Sau một ngày tạm gián đoạn vì lý do khách quan thì ngày 12 của hành trình đã chính thức quay trở lại rồi đây. Bây giờ là lúc để chúng ta sẽ cải tiến mã nguồn của mình.
Nếu bạn đã sẵn sàng, hãy lên đường cùng chúng mình thôi! 🚗
Nhận đầu vào từ người dùng
Hôm qua, chúng ta đấu cứng giá trị của các biến và hằng số, gồm challenge
,
totalDays
và daysCompleted
. Bây giờ là lúc để chúng ta thêm biến mới và
điều chỉnh mã nguồn. Kết quả được hiện ngay bên dưới.
Vì số ngày và tên người dùng có thể thay đổi liên tục, do đó cần phải cho phép người dùng
nhập từ đầu vào hệ thống. Chúng ta tiếp tục thay đổi mã nguồn, lần này sẽ sử dụng một hàm
khác từ trong gói fmt
.
Ta sẽ sử dụng câu lệnh sau để cho phép người dùng nhập thông tin.
Dấu &
được chỉ định là một con trỏ và chúng ta sẽ tìm hiểu
ở phần tiếp theo.
Mã nguồn và kết quả sẽ được thay đổi như sau.
Việc cuối cùng trong ngày hôm nay, là bổ sung thêm thông tin số ngày còn lại của hành trình, để chúng ta có thể dễ dàng kiểm tra hơn lịch trình chuyến đi.
Chúng ta khai báo thêm một biến có tên là remainingDays
. Biến này có giá trị khởi tạo
là 90
, và điều chỉnh dựa trên công thức sau.
Mã nguồn chương trình sẽ tiếp tục được cập nhật và kết quả sẽ thay đổi như sau.
Con trỏ 👆
Con trỏ được xem như một biến, biến này sẽ trỏ về địa chỉ của một biến khác. Địa chỉ này có định dạng thập lục phân (ô nhớ). Mọi người có thể tìm hiểu thêm về con trỏ tại đây
Để dễ hiểu, hãy xem đoạn mã nguồn và kết quả sau.
Giá trị đầu tiên, người ta thường gọi là tham trị. Giá trị thứ hai, người ta thường gọi là tham chiếu.
Hết nội dung ngày 12. Xin chào tạm biệt! 👋
Ngày 13 - Thực hiện chương trình
Xin chào mọi người, như vậy là sau những ngày bận rộn với nhiều việc thi nhật trình ngày 13 cũng đã sẵn sàng để cho lên sóng rồi đây. Hãy sẵn sàng để chứng kiến ứng dụng của chúng ta lên sóng chính thức thôi nào! ✈
Chỉnh sửa mã nguồn
Hãy nhìn đoạn mã nguồn hậu chỉnh sửa ngay sau đây. Với mã nguồn này, chúng ta sẽ xây dựng một trang web chứa các thông tin liên quan đến hành trình của chúng ta.
Cây thư mục
Với mã nguồn này, cây thư mục web
của chúng ta sẽ có tất cả ba tập tin như sau.
Thư mụcsrc/
Thư mụchello/
- main.go
Thư mụcweb/
- index.html
- note.txt
- main.go
Tập tin index.html 💻
Một tập tin có phần mở rộng kết thúc bằng .html là một trang web. Điểm đặc biệt của tập tin này chính là, nếu ta mở nó ở trình duyệt, ta sẽ thấy trọn vẹn trang web đó (giống như web 90 ngày DevOps chẳng hạn). Tuy nhiên, nếu ta mở ở trình chỉnh sửa tập tin, nó sẽ có cấu trúc như thế này.
Ở đây, tập tin index.html
sẽ được điều chỉnh để tiếp nhận những thông tin từ chương trình Go của
chúng ta. Cụ thể nó như thế này.
html lang="vi"
chỉ định ngôn ngữ tiếng Việt cho trang Web- Các nội dung còn lại vẫn tương tự như cũ, tuy nhiên vẫn có những chỗ lạ lẫm mà ta có thể không rõ như
{{ .FacebookName }}
hay{{ .DaysCompleted }}
, ta sẽ lưu ý nó sau.
Tập tin note.txt 📝
Đây là nội dung của tập tin.
Có 3 trường thông tin, gồm tên facebook, số ngày hoàn thành (13) và số ngày còn lại (77), ngăn cách với nhau bằng dấu phẩy. Tập tin này có thể điều chỉnh tùy ý.
Tập tin main.go
Đoạn mã nguồn đầu tiên
Hãy chú ý đoạn mã nguồn này.
Ngoài thư viện fmt
chuẩn ra, ta có thấy có một loạt các thư viện khác xuất hiện.
Cụ thể như sau.
html/template
vànet/http
: Một thư viện chuyên dụng để sử dụng các tập tin HTML, còn thư viện còn lại là thư viện chủ lực trong thực hiện tạo một máy chủ cho trang web.log
vàos
: Cặp thư viện này có hai vai trò: Một là phục vụ tương tác với tập tin/hệ điều hành (OS), hai là xử lý ghi nhật trình và báo lỗi nếu có sự cố xảy ra trong quá trình vận hành ứng dụng.strconv
vàstrings
: Cặp thư viện liên quan đến xử lý kiểu dữ liệu dạng chuỗi, trong đóstrconv
là chuyển đổi một biến bất kỳ sang chuỗi hoặc ngược lại.
Khối cấu trúc định hình
Ta tạo một khối cấu trúc như sau.
Khối này định hình trang web của chúng ta chứa những thông tin gì. Kiểu dữ liệu và tên gọi có thể mọi người đã quen thuộc, nếu chưa, hãy quay lại những ngày trước để xem lại nhé.
Hàm xử lý nội dung trang web
Hàm này nhận đầu vào chính là tên tập tin văn bản (txt) của chúng ta, đồng thời trả về một con trỏ tương ứng với trang đó. Hàm chạy như sau.
- Mở tập tin văn bản. Nếu không mở được tập tin nào có định dạng tương ứng, báo lỗi.
- Chia tách dãy thông tin trong tập tin thành ba thông tin khác nhau. Kiểm tra định dạng và sự tồn tại của cả ba thông tin, nếu có sai sót, báo lỗi.
- Chuyển đổi ngược trở lại hai thông tin số ngày về kiểu dữ liệu số (sau khi chuyển sang kiểu chuỗi để kiểm tra đầu vào).
- Truyền tham chiếu (con trỏ) chứa toàn bộ thông tin tương ứng để chờ tạo một trang web.
Hàm xử lý giao diện web
Controller, cũng như một cái cần gạt, giúp xử lý toàn bộ ứng dụng web của chúng ta. Hàm này vận hành như sau.
- Đọc đường dẫn và kiểm tra sự hiện diện của tập tin văn bản có tên tương ứng. Cụ thể
là
view/abc/
ứng với tập tinabc.txt
. Nếu không có, báo lỗi. - Tải tập tin mẫu
index.html
lên hệ thống, nếu có mẫu. Nếu không có, báo lỗi. - Gán dữ liệu (map) thông tin của các trường thông tin tương ứng với các biến vào tập
tin mẫu
index.html
để xử lý. Đây chính là nơi mà các ký hiệu lạ trong tập tin mẫu của chúng ta ở phần đầu như{{ .FacebookName }}
hay{{ .DaysCompleted }}
được lưu dữ liệu.
Hàm chính và kết quả cuối cùng
Hàm này làm nhiệm vụ khởi động và đưa cần gạt về đúng bộ phận quản lý. Đồng thời, hàm này cũng sẽ mở kết nối trên cổng 8080 để đưa trang web vận hành cũng như báo lỗi nếu phát hiện sai sót.
Chạy chương trình bằng lệnh quen thuộc tại thư mục chứa các tập tin này.
Đây là kết quả cuối cùng của chúng ta.
Nhấn Ctrl+C
để kết thúc chương trình.
Như vậy, hành trình Golang của chúng ta đã hoàn thành. Với đoạn mã nguồn này, chúng ta còn có thể làm được nhiều điều hơn, ví dụ chỉnh sửa tổng số ngày cũng như tên của một hành trình nào đó để người dùng có thể tự nhập vào hệ thống.
Hy vọng, tất cả mọi người đã có được những trải nghiệm tuyệt vời cùng điểm dừng chân này.
Tài liệu tham khảo 📚
Mời mọi người chuyển sang trang này để theo dõi tất cả tài liệu liên quan trong giai đoạn 2, để giúp bản thân có được những tài liệu hữu ích về Golang trong làm việc với DevOps.
Giai đoạn 2 - Tham khảoHẹn gặp mọi người ở những ngày tiếp theo, nơi mà chúng ta sẽ bắt đầu làm việc với Linux - một hệ điều hành cực kỳ gần gũi với các lập trình viên cũng như kỹ sư DevOps. 🚀