1. Go là gì?
Go, còn được gọi là Golang, là một ngôn ngữ lập trình mã nguồn mở được phát triển bởi Google. Go được thiết kế với mục tiêu giúp lập trình viên viết code đơn giản, dễ đọc, có hiệu năng tốt và phù hợp với những hệ thống cần xử lý nhiều công việc cùng lúc.
Go có cú pháp tương đối gọn gàng, cách tổ chức chương trình rõ ràng và hỗ trợ biên dịch thành tệp thực thi. Nhờ đó, chương trình Go có thể chạy trực tiếp trên môi trường phù hợp mà không cần phải thông dịch từng dòng code như một số ngôn ngữ khác.
Hiện nay, Go thường được sử dụng để phát triển Backend, REST API, hệ thống mạng, công cụ dòng lệnh, microservices và các ứng dụng chạy trên máy chủ. Đây là ngôn ngữ phù hợp với những dự án cần tốc độ xử lý tốt, khả năng mở rộng và dễ bảo trì.
2. Đặc điểm nổi bật của Go
Go được thiết kế theo hướng đơn giản và thực tế. Ngôn ngữ này không có quá nhiều cú pháp phức tạp, giúp người mới học dễ tiếp cận và người đã có kinh nghiệm có thể nhanh chóng đọc hiểu code của người khác.
Một đặc điểm nổi bật của Go là hiệu năng tốt nhờ cơ chế biên dịch thành mã máy. Chương trình Go thường có thể thực thi nhanh và sử dụng tài nguyên tương đối hiệu quả, tùy thuộc vào cách thiết kế ứng dụng.
Bên cạnh đó, Go hỗ trợ xử lý đồng thời thông qua Goroutines và Channels. Những cơ chế này giúp chương trình thực hiện nhiều công việc trong cùng một khoảng thời gian hiệu quả hơn, đặc biệt với các hệ thống máy chủ phải tiếp nhận nhiều yêu cầu từ người dùng.
Go cũng có hệ thống quản lý bộ nhớ tự động thông qua Garbage Collector, giúp lập trình viên giảm bớt việc phải tự quản lý và giải phóng bộ nhớ thủ công. Ngoài ra, Go cung cấp các công cụ tích hợp để định dạng code, kiểm thử và quản lý thư viện, hỗ trợ quá trình phát triển phần mềm.

3. Cấu trúc cơ bản của một chương trình Go
Một chương trình Go thường được tổ chức thành các package. Package giúp nhóm những đoạn code có liên quan vào cùng một đơn vị để dễ quản lý và tái sử dụng.
Ví dụ, một chương trình Go đơn giản có thể viết như sau:
package main
import "fmt"
func main() {
fmt.Println("Hello, Go!")
}
Giải thích các thành phần:
package main: khai báo package chính của chương trình thực thi.import "fmt": nhập packagefmt, cung cấp các chức năng định dạng và hiển thị dữ liệu.func main(): khai báo hàmmain, là điểm bắt đầu thực thi của một chương trình Go độc lập thuộc packagemain.fmt.Println(...): in nội dung ra màn hình và xuống dòng sau khi in.
Khi chạy chương trình, kết quả hiển thị là Hello, Go!. Đây là ví dụ cơ bản giúp làm quen với cách khai báo package, nhập thư viện và xây dựng một hàm trong Go.
4. Biến và hằng số trong Go
Biến được sử dụng để lưu trữ dữ liệu trong quá trình chương trình hoạt động. Mỗi biến có một kiểu dữ liệu nhất định, chẳng hạn số nguyên, số thực, chuỗi ký tự hoặc giá trị đúng sai.
Trong Go, có thể khai báo biến bằng từ khóa var hoặc sử dụng cú pháp := để khai báo và gán giá trị ngay trong một hàm.
Ví dụ:
package main
import "fmt"
func main() {
var name string = "An"
age := 20
fmt.Println(name)
fmt.Println(age)
}
5. Các kiểu dữ liệu cơ bản trong Go
Go cung cấp nhiều kiểu dữ liệu để biểu diễn những loại thông tin khác nhau. Việc lựa chọn đúng kiểu dữ liệu giúp chương trình hoạt động chính xác và dễ hiểu hơn.
Một số kiểu dữ liệu thường gặp gồm:
int: dùng để lưu số nguyên.float64: dùng để lưu số thực có độ chính xác cao.string: dùng để lưu chuỗi ký tự.bool: chỉ nhận hai giá trịtruehoặcfalse.byte: là bí danh củauint8, thường dùng để biểu diễn một byte dữ liệu.rune: là bí danh củaint32, thường dùng để biểu diễn một giá trị Unicode.
6. Câu điều kiện và vòng lặp
Câu điều kiện và vòng lặp là những cấu trúc điều khiển cơ bản, giúp chương trình đưa ra quyết định và thực hiện công việc lặp lại theo yêu cầu.
Trong Go, câu điều kiện if được dùng để kiểm tra một điều kiện. Nếu điều kiện đúng, chương trình thực hiện đoạn code tương ứng; nếu sai, chương trình có thể chuyển sang nhánh else.
Ví dụ:
age := 20
if age >= 18 {
fmt.Println("Đủ tuổi")
} else {
fmt.Println("Chưa đủ tuổi")
}
Đoạn code kiểm tra biến age. Nếu giá trị lớn hơn hoặc bằng 18, chương trình in ra thông báo đủ tuổi.
Đối với vòng lặp, Go sử dụng từ khóa for để thực hiện một đoạn code nhiều lần. Ví dụ:
for i := 1; i <= 5; i++ {
fmt.Println(i)
}
Trong đó, i := 1 khởi tạo biến đếm, i <= 5 là điều kiện tiếp tục lặp và i++ tăng giá trị biến đếm lên một sau mỗi lần thực hiện. Kết quả là các số từ 1 đến 5 được in ra màn hình.
Go chỉ sử dụng for làm cấu trúc lặp chính, nhưng có thể dùng nó theo nhiều cách khác nhau để thay thế các dạng vòng lặp thường gặp trong những ngôn ngữ khác.
7. Hàm trong Go
Hàm (Function) là một khối code thực hiện một nhiệm vụ cụ thể. Việc chia chương trình thành các hàm giúp tránh lặp lại code, dễ kiểm thử và thuận tiện khi bảo trì.
Trong Go, hàm được khai báo bằng từ khóa func. Hàm có thể nhận tham số đầu vào và trả về một hoặc nhiều giá trị.
Ví dụ:
func add(a int, b int) int {
return a + b
}
Trong ví dụ này, add là tên hàm, a và b là hai tham số kiểu số nguyên, còn int sau dấu ngoặc đóng cho biết hàm trả về một giá trị kiểu số nguyên.
Khi gọi add(3, 5), hàm tính tổng hai số và trả về kết quả là 8. Từ khóa return dùng để trả kết quả về nơi gọi hàm.
Hàm đặc biệt hữu ích khi ứng dụng có nhiều chức năng như tính toán, kiểm tra dữ liệu, xử lý thông tin người dùng hoặc gọi dịch vụ bên ngoài. Thay vì viết lại cùng một đoạn code nhiều lần, lập trình viên chỉ cần gọi lại hàm khi cần.
8. Struct và phương thức trong Go
Struct là kiểu dữ liệu cho phép nhóm nhiều trường dữ liệu có thể thuộc những kiểu khác nhau vào cùng một cấu trúc. Struct thường được sử dụng để biểu diễn những đối tượng có nhiều thuộc tính, chẳng hạn người dùng, sản phẩm hoặc đơn hàng.
Ví dụ:
type User struct {
Name string
Age int
}
Đoạn code trên khai báo một kiểu dữ liệu tên User với hai trường là Name và Age. Khi cần lưu thông tin một người dùng, chương trình có thể tạo một giá trị thuộc kiểu User và gán dữ liệu cho các trường tương ứng.
Phương thức (Method) là hàm được gắn với một kiểu dữ liệu thông qua receiver. Trong Go, phương thức thường được sử dụng để mô tả những hành động liên quan đến một cấu trúc dữ liệu.
Ví dụ:
func (u User) Introduce() {
fmt.Println("Tên:", u.Name)
}
Trong đó, (u User) là receiver, cho biết phương thức Introduce() được gắn với kiểu User. Khi gọi phương thức này trên một giá trị User, chương trình sẽ in tên người dùng ra màn hình.
Struct và phương thức giúp tổ chức dữ liệu và hành vi liên quan một cách rõ ràng. Tuy nhiên, Go không sử dụng hệ thống lớp (class) và kế thừa theo cách truyền thống như Java hoặc C#; thay vào đó, ngôn ngữ này sử dụng struct, method, interface và composition để tổ chức chương trình.
9. Goroutines và xử lý đồng thời
Goroutine là một trong những đặc điểm nổi bật của Go. Đây là đơn vị thực thi nhẹ do Go runtime quản lý, cho phép chương trình chạy một hàm đồng thời với các công việc khác mà không cần tạo một hệ điều hành thread riêng cho mỗi hàm.
Để khởi chạy một goroutine, lập trình viên sử dụng từ khóa go trước lời gọi hàm.
Ví dụ:
go processData()
Đoạn code trên yêu cầu Go chạy hàm processData() trong một goroutine. Hàm này có thể thực hiện công việc trong khi phần code khác tiếp tục hoạt động.
Goroutines thường hữu ích trong các ứng dụng máy chủ phải xử lý nhiều kết nối, thực hiện nhiều tác vụ độc lập hoặc xử lý dữ liệu song song. Tuy nhiên, chạy đồng thời không có nghĩa là mọi công việc đều tự động nhanh hơn. Nếu các tác vụ cùng truy cập dữ liệu chung mà không được kiểm soát, chương trình có thể xảy ra lỗi tranh chấp dữ liệu (race condition).
Vì vậy, khi sử dụng goroutine, lập trình viên cần chú ý đến cách đồng bộ dữ liệu và quản lý vòng đời của các tác vụ.
10. Channels trong Go
Channel là cơ chế cho phép các goroutine trao đổi dữ liệu và phối hợp với nhau. Thay vì để nhiều goroutine tự ý thay đổi cùng một dữ liệu dùng chung, chương trình có thể sử dụng channel để gửi và nhận thông tin giữa các tác vụ.
Ví dụ:
ch := make(chan string)
go func() {
ch <- "Hoàn thành"
}()
result := <-ch
fmt.Println(result)
Trong đoạn code trên, make(chan string) tạo một channel dùng để truyền dữ liệu kiểu chuỗi. Toán tử <- được dùng để gửi dữ liệu vào channel hoặc nhận dữ liệu từ channel.
Dòng ch <- "Hoàn thành" gửi chuỗi vào channel. Dòng result := <-ch nhận dữ liệu từ channel và lưu vào biến result, sau đó chương trình in kết quả ra màn hình.
Với channel không có bộ đệm như ví dụ trên, thao tác gửi và nhận sẽ phối hợp với nhau. Vì vậy, chương trình có thể chờ tại một thao tác cho đến khi có goroutine thực hiện thao tác tương ứng. Channel giúp các goroutine trao đổi thông tin có kiểm soát, nhưng vẫn cần thiết kế cẩn thận để tránh tình trạng chờ vô thời hạn hoặc deadlock.
11. Package và quản lý thư viện
Package là cách Go nhóm các đoạn code có liên quan thành những đơn vị có thể sử dụng lại. Một dự án có thể chia thành nhiều package để tách biệt các chức năng như xử lý người dùng, kết nối cơ sở dữ liệu, xác thực hoặc gửi thông báo.
Go cũng có hệ thống quản lý phụ thuộc thông qua Go Modules. Go Modules giúp xác định module của dự án và quản lý các thư viện bên ngoài mà chương trình cần sử dụng.
Một số lệnh thường gặp:
go mod init example.com/myapp
go mod tidy
go run .
go build
Trong đó:
go mod init: khởi tạo một module mới cho dự án.go mod tidy: kiểm tra và cập nhật các thư viện cần thiết dựa trên code của dự án.go run .: biên dịch và chạy chương trình trong module hiện tại.go build: biên dịch chương trình thành tệp thực thi phù hợp với môi trường mục tiêu.
Việc tổ chức package và quản lý thư viện đúng cách giúp dự án dễ mở rộng, giảm sự phụ thuộc không cần thiết và thuận tiện hơn khi làm việc nhóm.
12. Go được sử dụng trong những lĩnh vực nào?
Go thường được sử dụng trong phát triển Backend và REST API, nơi máy chủ phải tiếp nhận request, xử lý dữ liệu và trả kết quả cho nhiều người dùng. Với hiệu năng tốt, cú pháp gọn và hỗ trợ xử lý đồng thời, Go phù hợp với nhiều hệ thống dịch vụ cần khả năng mở rộng.
Ngoài ra, Go còn được dùng để xây dựng microservices, công cụ dòng lệnh, dịch vụ mạng, phần mềm tự động hóa và các thành phần hạ tầng. Nhiều công cụ dành cho môi trường cloud và DevOps cũng được phát triển bằng Go.
Ví dụ, lập trình viên có thể sử dụng Go để xây dựng API cho ứng dụng bán hàng, xử lý yêu cầu đăng nhập, lấy thông tin sản phẩm và kết nối với cơ sở dữ liệu. Khi lượng người dùng tăng, ứng dụng có thể được triển khai trên nhiều máy chủ để đáp ứng nhu cầu xử lý.
Dù vậy, Go không phải lựa chọn tối ưu cho mọi loại dự án. Việc chọn ngôn ngữ vẫn cần dựa trên yêu cầu sản phẩm, hệ sinh thái thư viện, kinh nghiệm của đội ngũ và khả năng vận hành hệ thống.
13. Kết luận
Go Fundamentals là nhóm kiến thức nền tảng giúp lập trình viên hiểu cách ngôn ngữ Go hoạt động và cách xây dựng một chương trình cơ bản. Những nội dung quan trọng bao gồm cú pháp, biến, kiểu dữ liệu, câu điều kiện, vòng lặp, hàm, struct, phương thức, goroutine, channel và quản lý package.
Nắm vững các kiến thức này sẽ tạo nền tảng để tiếp tục học Go trong phát triển Backend, xây dựng REST API và làm việc với cơ sở dữ liệu. Đặc biệt, cần hiểu rõ cách xử lý lỗi, quản lý dữ liệu, kiểm thử và xử lý đồng thời trước khi áp dụng Go vào những dự án thực tế có quy mô lớn.








Khoá học lập trình game con rắn cho trẻ em




