Go Zero to Hero - Bài 6: Khai báo biến, hằng số và từ khoá iota
Trong Go, có nhiều cách để khai báo một biến, tùy thuộc vào ngữ cảnh bạn đang sử dụng.
1. Khai báo biến (Variables): 3 cấp độ từ truyền thống đến siêu tốc
Cấp độ 1: Khai báo tường minh (Rõ ràng nhất)
Đây là cách khai báo đầy đủ từ khóa var, tên biến, kiểu dữ liệu và giá trị khởi tạo.
var age int = 21
var name string = "Huy Hoàng"
Zero Value (Giá trị mặc định): Một điểm cực kỳ an toàn của Go là nếu bạn khai báo biến mà KHÔNG gán giá trị, Go sẽ không bao giờ văng lỗi
undefinedhay gán giá trị rác (như C/C++). Nó sẽ tự động gán giá trị "Zero Value" tương ứng của kiểu dữ liệu đó:
int,float:0string:""(chuỗi rỗng)bool:false
var count int // count tự động mang giá trị 0
Cấp độ 2: Lược bỏ kiểu dữ liệu (Type Inference)
Nếu bạn gán giá trị ngay lúc khai báo, trình biên dịch của Go đủ thông minh để tự suy luận ra kiểu dữ liệu. Bạn có thể bỏ qua việc ghi kiểu.
var email = "contact@hoang.dev" // Go tự hiểu đây là string
var isDeveloper = true // Go tự hiểu đây là bool
Cấp độ 3: Khai báo ngắn gọn với toán tử := (Dùng nhiều nhất)
Đây là cú pháp bạn sẽ thấy ở 90% các dòng code Go. Toán tử := (Gopher hay gọi là "walrus operator" vì trông giống mặt con hải mã) giúp gộp cả từ khóa var và kiểu dữ liệu lại.
func main() {
serverPort := 8080
appName := "Microservice AFC"
// Khai báo nhiều biến cùng lúc
x, y, z := 1, 2, 3
}
Lưu ý cực kỳ quan trọng về
:=:
- Bạn chỉ có thể sử dụng
:=ở bên trong một hàm (function). Nếu bạn muốn khai báo một biến toàn cục (Global variable) ở ngoài hàm, bạn BẮT BUỘC phải dùng từ khóavar.- Không được dùng
:=để gán lại giá trị cho một biến đã tồn tại (lúc đó chỉ dùng dấu=bình thường).
2. Hằng số (Constants): Sự bất biến
Hằng số là những giá trị không bao giờ thay đổi trong suốt vòng đời của chương trình. Chúng ta dùng từ khóa const.
const Pi float64 = 3.14159
const MaxConnections = 100 // Tự suy luận kiểu là int
Đặc điểm cốt lõi của const trong Go:
Giá trị của hằng số phải được xác định ngay lúc biên dịch (Compile time). Bạn không thể gán kết quả của một hàm chạy lúc Runtime cho một hằng số.
// HỢP LỆ
const AppVersion = "1.0.2"
// BÁO LỖI! Vì time.Now() chỉ chạy khi chương trình thực sự chạy (Runtime)
const StartTime = time.Now()
3. Tuyệt chiêu iota: Khắc phục sự vắng mặt của Enum
Nếu bạn đã quen với enum trong C++, Java hay TypeScript để định nghĩa một tập hợp các trạng thái (ví dụ: Trạng thái đơn hàng, Role người dùng), bạn sẽ nhận ra... Go không có từ khóa enum!
Thay vào đó, Go cung cấp một vũ khí rất thanh lịch mang tên iota.
iota là một định danh (identifier) đặc biệt, chỉ được sử dụng chung với const. Nó hoạt động như một bộ đếm (counter) tự động tăng dần, bắt đầu từ 0.
Ví dụ thực tế: Quản lý trạng thái vé (Ticket Status)
package main
import "fmt"
const (
TicketPending = iota // 0
TicketPaid // 1 (Tự động lặp lại quy tắc của dòng trên và iota tăng lên 1)
TicketCancelled // 2
TicketRefunded // 3
)
func main() {
fmt.Println("Trạng thái chờ thanh toán:", TicketPending)
fmt.Println("Trạng thái đã hủy:", TicketCancelled)
}
Bỏ qua giá trị với dấu gạch dưới _
Đôi khi bạn không muốn bắt đầu từ 0, hoặc muốn bỏ qua một số vị trí nào đó. Bạn có thể kết hợp iota với Blank Identifier _.
const (
_ = iota // Bỏ qua giá trị 0
RoleUser // 1
RoleAdmin // 2
RoleSuperAdmin // 3
)
Ứng dụng nâng cao: Dịch bit (Bitwise)
iota cực kỳ mạnh khi bạn muốn tạo các hằng số cấu hình theo hệ cơ số 2 (như dung lượng file: KB, MB, GB).
const (
_ = iota
KB = 1 << (10 * iota) // 1 lùi 10 bit = 1024
MB = 1 << (10 * iota) // 1 lùi 20 bit = 1048576
GB = 1 << (10 * iota) // 1 lùi 30 bit = 1073741824
)
Cú pháp trên trông như ma thuật, nhưng nó thể hiện sức mạnh biểu đạt cực cao của iota giúp code của bạn gọn gàng, tránh việc phải gõ những con số khổng lồ dễ sai sót.
Tổng kết
Qua bài này, chúng ta đã nắm bắt được:
var: Khai báo biến chuẩn mực, dùng được mọi nơi (Zero Value an toàn).:=: Cú pháp khai báo biến siêu tốc, nhưng chỉ dùng bên trong hàm.const: Khai báo hằng số bất biến ở thời điểm Compile.iota: Tuyệt chiêu tự động tăng bộ đếm, giải pháp hoàn hảo thay thế cho Enum truyền thống.
All rights reserved