Go – Hằng số

Trong ngôn ngữ lập trình Go, chúng ta sử dụng thuật ngữ constant để miêu tả các gía trị không đổi như là 51.34true"Hello". Những giá trị không đổi này còn được gọi là literals

Hằng số có thể là bất kỳ kiểu dữ liệu cơ bản nào như là hằng số integer, hằng số floating hay một string literal. Ngoài ra còn có hằng số enumeration.

Các hằng số được xử lý như một biến bình thường ngoại trừ việc giá trị của nó sẽ không thể chỉnh sửa sau khi định nghĩa.

Hằng số Ví dụ
Hằng số integer 100067413
Hằng số floating 4.56128.372
Hằng số boolean truefalse
Hằng số rune 'C''ä'
Hằng số complex 2.7i3 + 5i
Hằng số string "Hello""Rajeev"

 

Khai báo một hằng số

Literals là một hằng số mà không cần tên. Để khai báo hằng số và đặt tên cho nó, chúng ta có thể sử dụng từ khoá const như sau

Chúng ta cũng có thể chỉ định kiểu như

Chúng ta cũng có thể khai báo nhiều hằng số trong một câu lệnh

Các hằng số, như chúng ta mong muốn, không thể bị thay đổi. Nghĩa là, không thể gán lại hằng số cho một giá trị khác sau khi nó đã được khởi tạo

Hằng số không gán kiểu

Bất kỳ hằng số nào trong Golang, được đặt tên hoặc không đặt tên, đều có thể không cần gán kiểu trừ khi định nghĩa cho nó một kiểu rõ ràng. Hãy cùng xem ví dụ sau đây, tất cả các hằng số đều không gán kiểu

Chúng không được gán kiểu cho dù chúng ta có đặt tên cho nó

Giá trị 1 là một integer, 4.5 là một float, và "hello" là một string. Nhưng chúng chỉ là các giá trị và chưa được gán một kiểu cố định, như là int32 hoặc float64 hoặc string, điều đó sẽ bắt buộc chúng phải tuân theo quy tắc kiểu nghiêm ngặt trong Go.

Thực tế rằng giá trị 1 không được gán kiểu cho phép chúng ta gán nó cho bất kỳ biến nào mà có kiểu tương thích với integer.

Mặc dù giá trị 1 không được gán kiểu, nó là một integer không gán kiểu. Nên nó chỉ có thể được sử dụng ở nơi integer được cho phép. Bạn không thể gán nó cho một biến string hoặc boolean.

Tương tự như vậy, hằng số floating không gán kiểu như là 4.5 có thể sử dụng bất kỳ chỗ nào kiểu floating cho phép

Trong Golang, chúng ta có thể tạo một bí danh kiểu bằng cách sử dụng từ khoá type như sau

Do đặc tính được định kiểu mạnh mẽ trong Go, bạn sẽ không thể gán một biến string cho biến RichString

Nhưng chúng ta có thể gán hằng số string không được gán kiểu cho biến RichString bởi vì nó tương thích với string

Hằng số và suy luận kiểu: Giá trị mặc định

Go hỗ trợ suy luận kiểu. Nó có thể suy luận ra kiểu của một biến từ giá trị mà nó được khởi tạo. Nên bạn có thể khai báo một biến với một giá trị khởi tạo mà không cần thông tin về kiểu, và Go sẽ tự động xác định kiểu cho nó

Bạn có thể tìm hiểu rõ hơn trong bài viết trước về kiểu dữ liệu trong Golang.

Hằng số được gán kiểu

Trong Golang, hằng số được định kiểu khi chúng ta chỉ định kiểu rõ ràng trong khai báo như sau

Cũng giống như các biến, tất cả các quy tắc của hệ thống kiểu trong Go áp dụng cho hằng số được gán kiểu. Ví dụ, bạn không thể gán kiểu hằng số integer cho biến float

Với các hằng số được định kiểu, bạn sẽ mất đi tính linh động so với hằng số không được định kiểu như là gán chúng cho biến bất kỳ với kiểu tương thích hoặc pha trộn chúng với các toán tử toán học. Nên bạn chỉ khai báo kiểu cho hằng số nếu nó thực sự cần thiết. Ngoài ra chỉ nên khai báo hằng số không gán kiểu.

Các biểu thức

Một thực tế rằng, hằng số không gán kiểu cho phép chúng ta có thể pha trộn chúng bằng các biểu thức một cách thoải mái.

Nên bạn có thể có một biểu thức hằng số có thể chứa hỗn hợp các hằng số không gán kiểu khác nhau miễn là những hằng số này là tương thích với nhau.

Tính toán của biểu thức và kết quả của nó tuân theo quy tắc nhất định.

1. Toán tử so sánh giữa 2 hằng số không gán kiểu luôn trả về một kiểu hằng số boolean.

2. Đối với các toán tử khác (ngoại trừ shift)

  • Nếu cả 2 toán hạng là cùng kiểu, kết quả trả về là cùng kiểu. Ví dụ biểu thức 25 / 2 thì kết quả trả về là 12 chứ không phải 12.5. Vì cả hai toán hạng đều là integer, nên kết quả được cắt ngắn thành số nguyên.
  • Nếu các toán hạng là khác kiểu, kết quả của kiểu toán hạng theo một quy tắc rộng hơn integer < rune < floating-point < complex
  • Toán tử shift hơi phức tạp một chút. Trước hết, có một số yêu cầu
    • Toán hạng bên phải của biểu thức shift phải có một kiểu integer không dấu hoặc một hằng số không gán kiểu, có thể biểu thị giá trị kiểu uint
    • Toán hạng bên trải phải có một kiểu integer hoặc là một hằng số không gán kiểu, có thể biểu thị giá trị kiểu int

Nếu toán tử bên trái của biểu thức shift là hằng số không gán kiểu, kết qủa sẽ là một hằng số integer không gán kiểu. Trường hợp còn lại kết quả sẽ cùng kiểu với toán hạng bên trái.

Ví dụ về biểu thức hằng số

Hãy cùng xem ví dụ về biểu thức hằng số sau

Kết quả

Vì cả 25 và 2 đều là int nên kết quả trả về cắt ngắn là 12

Để nhận được kết quả chính xác, chúng ta cần làm như sau

Hãy cùng xem một ví dụ khác

Kết quả sẽ là gì? Nó không phải là 17.

Kết quả thực tế của nó sẽ là 16.5. Hãy cùng lướt qua từng phần tính toán để hiểu tại sao kết quả là 16.5

Kết quả bị sai bởi vì 25 / 2 được làm tròn thành 12.

Để nhận được kết quả chính xác, bạn cần chỉnh sửa như sau

 

 

You May Also Like

About the Author: Nguyen Dinh Thuc

Leave a Reply

avatar
  Subscribe  
Notify of