Trong Go, không có kiểu enum (liệt kê) như trong một số ngôn ngữ khác (ví dụ như C, Java), nhưng chúng ta có thể mô phỏng enums một cách “idiomatic” bằng cách sử dụng hằng số có kiểu (typed constants) với kiểu dữ liệu cơ bản, chẳng hạn như int, string, hoặc kiểu tùy chỉnh. Thông qua cách này, bạn có thể đạt được kết quả tương tự như enums, và vẫn giữ được tính rõ ràng, dễ hiểu trong mã nguồn Go.
Dưới đây là một số cách biểu diễn enums theo phong cách idiomatic trong Go:
int)Một cách phổ biến để tạo ra enum trong Go là sử dụng hằng số với từ khóa iota. iota là một công cụ rất hữu ích trong Go để tạo ra một dãy các giá trị số nguyên tự động.
Ví dụ:
package main
import "fmt"
// Khai báo enum sử dụng iota
type Day int
const (
Sunday Day = iota
Monday
Tuesday
Wednesday
Thursday
Friday
Saturday
)
func main() {
var today Day = Friday
fmt.Println("Ngày hôm nay là:", today)
}
Trong ví dụ này, iota bắt đầu từ 0 và tăng dần lên cho mỗi hằng số tiếp theo. Do đó, Sunday sẽ là 0, Monday là 1, và cứ tiếp tục như vậy.
string) cho enumsNếu bạn muốn hiển thị giá trị enum dưới dạng chuỗi thay vì số nguyên (có thể hữu ích trong các ứng dụng như logging hay in ra giao diện người dùng), bạn có thể sử dụng kiểu chuỗi.
Ví dụ:
package main
import "fmt"
type Color string
const (
Red Color = "Red"
Green Color = "Green"
Blue Color = "Blue"
)
func main() {
var myColor Color = Red
fmt.Println("Màu của tôi là:", myColor)
}
Trong ví dụ này, Color là một kiểu chuỗi, và các giá trị của enum được biểu diễn dưới dạng chuỗi.
iota kết hợp với các hàm bổ sungĐể enum trở nên hữu ích hơn, bạn có thể tạo thêm các phương thức để chuyển đổi giá trị của enum thành chuỗi nhằm mục đích hiển thị dễ dàng hơn.
Ví dụ:
package main
import "fmt"
// Định nghĩa kiểu dữ liệu cho các trạng thái
type Status int
const (
Pending Status = iota
Active
Inactive
Deleted
)
// Phương thức để chuyển đổi Status thành chuỗi
func (s Status) String() string {
switch s {
case Pending:
return "Pending"
case Active:
return "Active"
case Inactive:
return "Inactive"
case Deleted:
return "Deleted"
default:
return "Unknown"
}
}
func main() {
status := Active
fmt.Println("Trạng thái hiện tại là:", status)
}
Ở đây, phương thức String() cho phép chuyển đổi giá trị của Status thành một chuỗi dễ đọc, giúp dễ dàng in ra giao diện người dùng hoặc ghi vào log.
Trong Go, các enum không được giới hạn bởi phạm vi giá trị như trong một số ngôn ngữ khác, vì chúng chỉ là hằng số số nguyên hoặc chuỗi. Do đó, khi làm việc với enums, bạn có thể cần kiểm tra tính hợp lệ của giá trị.
Ví dụ:
func IsValidStatus(s Status) bool {
switch s {
case Pending, Active, Inactive, Deleted:
return true
default:
return false
}
}
Phương thức IsValidStatus ở trên kiểm tra xem giá trị của Status có nằm trong danh sách các giá trị hợp lệ hay không.
Điểm đặc biệt của Go là các hằng số enum không bị giới hạn chỉ trong kiểu int hay string. Bạn có thể tạo enums cho bất kỳ kiểu dữ liệu nào trong Go, chẳng hạn như kiểu float, bool, hay thậm chí các kiểu tùy chỉnh khác.
Ví dụ với kiểu float64:
type Temperature float64
const (
Freezing Temperature = 0.0
Boiling Temperature = 100.0
)
iota: Dùng cho các enums kiểu số nguyên (int), tự động tăng giá trị.string) để dễ đọc hơn khi in ra hoặc ghi log.String() để chuyển đổi enum thành chuỗi hiển thị.Go tập trung vào sự đơn giản và hiệu quả, và cách biểu diễn enums này là một trong những ví dụ tiêu biểu của triết lý đó.