Trong Go, hằng (constants) là một khái niệm quan trọng và được sử dụng rộng rãi. Hằng là một giá trị không thể thay đổi sau khi được khai báo. Chúng được sử dụng để đại diện cho các giá trị cố định, giúp mã nguồn trở nên dễ đọc, dễ bảo trì và an toàn hơn. Trong bài viết này, chúng ta sẽ tìm hiểu chi tiết về hằng trong Go, bao gồm cách khai báo, các loại hằng, quy tắc đặt tên và một số ví dụ minh họa.
Khai Báo Hằng
Trong Go, chúng ta sử dụng từ khóa const
để khai báo hằng. Cú pháp cơ bản như sau:
go
const tên_hằng = giá_trị
Ví dụ:
go
const PI = 3.14159
const HELLO_WORLD = "Hello, World!"
Trong ví dụ trên, chúng ta khai báo hai hằng: PI
với giá trị 3.14159
và HELLO_WORLD
với giá trị "Hello, World!"
.
Ngoài ra, Go cũng cho phép khai báo nhiều hằng cùng một lúc bằng cách sử dụng khối const
:
go
const (
PI = 3.14159
E = 2.71828
GRAVITY = 9.8
)
Loại Hằng
Trong Go, có hai loại hằng chính: hằng có kiểu (typed constants) và hằng không có kiểu (untyped constants).
Hằng Có Kiểu (Typed Constants)
Hằng có kiểu là những hằng được khai báo với một kiểu dữ liệu cụ thể. Ví dụ:
go
const PI float64 = 3.14159
const HELLO string = "Hello, World!"
Trong ví dụ trên, PI
là một hằng có kiểu float64
, và HELLO
là một hằng có kiểu string
.
Hằng Không Có Kiểu (Untyped Constants)
Hằng không có kiểu là những hằng được khai báo mà không chỉ định kiểu dữ liệu. Go sẽ tự động suy ra kiểu dữ liệu của hằng dựa trên giá trị được gán. Ví dụ:
go
const PI = 3.14159 // Kiểu dữ liệu mặc định là float64
const HELLO = "Hello, World!" // Kiểu dữ liệu mặc định là string
Hằng không có kiểu rất hữu ích trong các biểu thức số học, vì chúng cho phép thực hiện các phép tính với độ chính xác cao hơn so với các giá trị có kiểu.
Quy Tắc Đặt Tên Hằng
Trong Go, có một số quy tắc đặt tên hằng cần tuân thủ:
- Tên hằng phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới (
_
). - Tên hằng có thể chứa chữ cái, chữ số và dấu gạch dưới.
- Theo quy ước, tên hằng thường được viết hoa và sử dụng dấu gạch dưới (
_
) để phân cách các từ (ví dụ:MAX_VALUE
,MIN_LIMIT
). - Nếu tên hằng bắt đầu bằng chữ hoa, hằng đó sẽ có phạm vi toàn cục (exported) và có thể được truy cập từ các gói khác.
- Nếu tên hằng bắt đầu bằng chữ thường, hằng đó sẽ có phạm vi cục bộ (unexported) và chỉ có thể được truy cập trong cùng một gói.
Ví Dụ Sử Dụng Hằng
Dưới đây là một số ví dụ minh họa cách sử dụng hằng trong Go:
Ví Dụ 1: Sử dụng hằng có kiểu
go
package main
import "fmt"
const PI float64 = 3.14159
func main() {
radius := 2.0
area := PI * radius * radius
fmt.Printf("Diện tích hình tròn có bán kính %.2f là %.2f\n", radius, area)
}
Kết quả:
Diện tích hình tròn có bán kính 2.00 là 12.57
Trong ví dụ này, chúng ta khai báo một hằng có kiểu PI
với giá trị 3.14159
. Sau đó, chúng ta sử dụng PI
để tính diện tích hình tròn.
Ví Dụ 2: Sử dụng hằng không có kiểu
go
package main
import "fmt"
const (
A = 1
B
C = 2
D
)
func main() {
fmt.Println(A, B, C, D) // Output: 1 1 2 2
}
Trong ví dụ này, chúng ta khai báo một nhóm hằng không có kiểu. Hằng B
và D
sẽ kế thừa giá trị của hằng trước đó (A
và C
tương ứng).
Ví Dụ 3: Sử dụng hằng trong biểu thức số học
go
package main
import "fmt"
const (
A = 1
B = 2
C = A * B
D = C / B
)
func main() {
fmt.Println(C, D) // Output: 2 1
}
Trong ví dụ này, chúng ta sử dụng hằng không có kiểu A
và B
để tính toán giá trị của hằng C
và D
. Kết quả là C
có giá trị 2
(kết quả của 1 * 2
), và D
có giá trị 1
(kết quả của 2 / 2
).
Ví Dụ 4: Sử dụng hằng với iota
iota
là một hằng đặc biệt trong Go, được sử dụng để tạo ra một chuỗi giá trị liên tục. Giá trị của iota
được tăng lên 1
sau mỗi lần khai báo hằng trong cùng một khối const
.
go
package main
import "fmt"
const (
A = iota // A = 0
B // B = 1
C // C = 2
D = iota // D = 3
E // E = 4
)
func main() {
fmt.Println(A, B, C, D, E) // Output: 0 1 2 3 4
}
Trong ví dụ này, chúng ta sử dụng iota
để tạo ra một chuỗi giá trị liên tục cho các hằng A
, B
, C
, D
và E
.
Kết Luận
Hằng là một khái niệm quan trọng trong Go, giúp mã nguồn trở nên dễ đọc, dễ bảo trì và an toàn hơn. Bằng cách sử dụng hằng, chúng ta có thể đại diện cho các giá trị cố định và tránh sử dụng các giá trị "ma thuật" trong mã nguồn. Go cung cấp hai loại hằng: hằng có kiểu và hằng không có kiểu, mỗi loại có ưu điểm riêng. Việc tuân thủ các quy tắc đặt tên hằng cũng rất quan trọng để đảm bảo tính nhất quán và dễ đọc của mã nguồn. Với các ví dụ minh họa trên, hy vọng bạn đã hiểu rõ hơn về cách sử dụng hằng trong Go và có thể áp dụng chúng một cách hiệu quả trong các dự án của mình.