Biến và hằng số là thành phần quan trọng trong lập trình, giúp lưu trữ và quản lý dữ liệu.
Định danh và từ khóa
Định danh
Trong ngôn ngữ lập trình, định danh là các từ do lập trình viên định nghĩa để biểu thị ý nghĩa đặc biệt, như tên biến, tên hằng số, tên hàm, v.v. Trong Go, định danh bao gồm chữ cái, chữ số và ký tự _ (dấu gạch dưới), và phải bắt đầu bằng chữ cái hoặc _. Ví dụ: abc, _, _123, a123.
Từ khóa
Từ khóa là các định danh được định nghĩa sẵn trong ngôn ngữ lập trình và có ý nghĩa đặc biệt. Từ khóa và từ đã được giữ lại không nên sử dụng làm tên biến.
Go có 25 từ khóa:
break default func interface select
case defer go map struct
chan else goto package switch
const fallthrough if range type
continue for import return var
Ngoài ra, Go còn có 37 từ được giữ lại.
Constants: true false iota nil
Types: int int8 int16 int32 int64
uint uint8 uint16 uint32 uint64 uintptr
float32 float64 complex128 complex64
bool byte rune string error
Functions: make len cap new append copy close delete
complex real imag
panic recover
Biến
Nguồn gốc của biến
Dữ liệu trong quá trình chạy chương trình được lưu trữ trong bộ nhớ. Khi muốn thao tác với dữ liệu, chúng ta cần tìm đến địa chỉ bộ nhớ của biến. Tuy nhiên, việc sử dụng trực tiếp địa chỉ bộ nhớ trong mã nguồn sẽ làm giảm tính đọc và dễ gây lỗi. Do đó, chúng ta sử dụng biến để lưu địa chỉ bộ nhớ, giúp truy cập dữ liệu một cách dễ dàng.
Loại biến
Biến (Variable) dùng để lưu trữ dữ liệu. Các loại dữ liệu khác nhau yêu cầu các loại biến khác nhau. Sau nhiều thập kỷ phát triển, các ngôn ngữ lập trình đã hình thành một tập hợp các kiểu dữ liệu cố định, bao gồm: kiểu số nguyên, kiểu số thực, kiểu boolean, v.v.
Mỗi biến trong Go đều có kiểu dữ liệu riêng và phải được khai báo trước khi sử dụng.
Khai báo biến
Biến trong Go cần được khai báo trước khi sử dụng, và không hỗ trợ khai báo lặp lại trong cùng một phạm vi. Biến khai báo trong Go phải được sử dụng.
Khai báo tiêu chuẩn
Cú pháp khai báo biến trong Go:
var tên_biến kiểu_dữ_liệu
Khai báo biến bắt đầu bằng từ khóa var, kiểu dữ liệu đặt sau tên biến, không cần dấu chấm phẩy ở cuối dòng. Ví dụ:
var ten string
var tuoi int
var dung bool
Khai báo hàng loạt
Việc khai báo mỗi biến bằng var có thể trở nên rườm rà, Go hỗ trợ khai báo hàng loạt:
var (
a string
b int
c bool
d float32
)
Khởi tạo biến
Khi khai báo biến, Go tự động khởi tạo vùng bộ nhớ tương ứng. Mỗi biến được khởi tạo với giá trị mặc định của kiểu dữ liệu, ví dụ: kiểu số nguyên và số thực mặc định là 0, chuỗi mặc định là chuỗi rỗng, boolean mặc định là false, slice, hàm, con trỏ mặc định là nil.
Chúng ta cũng có thể khởi tạo biến ngay khi khai báo. Cú pháp khởi tạo biến:
var tên_biến kiểu_dữ_liệu = biểu_thức
Ví dụ:
var ten string = "Q1mi"
var tuoi int = 18
Hoặc khởi tạo nhiều biến cùng lúc:
var ten, tuoi = "Q1mi", 20
Đưa ra kiểu dữ liệu
Đôi khi, chúng ta có thể bỏ qua kiểu dữ liệu, khi đó trình biên dịch sẽ tự động xác định kiểu dữ liệu dựa trên giá trị bên phải dấu =.
var ten = "Q1mi"
var tuoi = 18
Khai báo ngắn gọn
Trong hàm, có thể sử dụng cú pháp := để khai báo và khởi tạo biến.
package main
import (
"fmt"
)
// Biến toàn cục m
var m = 100
func main() {
n := 10
m := 200 // Khai báo biến cục bộ m
fmt.Println(m, n)
}
Biến vô danh
Khi sử dụng gán nhiều giá trị, nếu muốn bỏ qua một giá trị, có thể sử dụng biến vô danh (anonymous variable). Biến vô danh được biểu thị bằng dấu gạch dưới _, ví dụ:
func foo() (int, string) {
return 10, "Q1mi"
}
func main() {
x, _ := foo()
_, y := foo()
fmt.Println("x=", x)
fmt.Println("y=", y)
}
Biến vô danh không chiếm không gian tên, không phân bổ bộ nhớ, nên không có vấn đề về khai báo lặp lại. (Trong Lua và các ngôn ngữ khác, biến vô danh còn gọi là biến giả.)
Lưu ý:
- Mỗi câu lệnh bên ngoài hàm phải bắt đầu bằng từ khóa (var, const, func, v.v.).
:=không thể sử dụng bên ngoài hàm.- Dùng
_để giữ chỗ, bỏ qua giá trị.
Hằng số
So với biến, hằng số là giá trị không thay đổi, thường dùng để định nghĩa các giá trị không thay đổi trong quá trình chạy chương trình. Cú pháp khai báo hằng số giống như khai báo biến, chỉ thay var bằng const, và hằng số phải được gán giá trị khi khai báo.
const pi = 3.1415
const e = 2.7182
Sau khi khai báo pi và e, giá trị của chúng không thể thay đổi trong suốt quá trình chạy chương trình.
Có thể khai báo nhiều hằng số cùng lúc:
const (
pi = 3.1415
e = 2.7182
)
Nếu bỏ qua giá trị khi khai báo nhiều hằng số, giá trị sẽ giống như hằng số phía trên. Ví dụ:
const (
n1 = 100
n2
n3
)
Hằng số n1, n2, n3 đều có giá trị là 100.
iota
iota là bộ đếm hằng số trong Go, chỉ sử dụng được trong biểu thức hằng số.
iota được đặt lại thành 0 khi từ khóa const xuất hiện. Mỗi dòng khai báo hằng số mới sẽ tăng iota lên 1 (có thể hiểu iota là chỉ số dòng trong khối const). Sử dụng iota giúp đơn giản hóa việc định nghĩa, đặc biệt hữu ích khi định nghĩa enum.
Ví dụ:
const (
n1 = iota //0
n2 //1
n3 //2
n4 //3
)
Một số ví dụ về iota:
Sử dụng _ để bỏ qua một số giá trị:
const (
n1 = iota //0
n2 //1
_
n4 //3
)
iota giữa các khai báo:
const (
n1 = iota //0
n2 = 100 //100
n3 = iota //2
n4 //3
)
const n5 = iota //0
Định nghĩa cấp độ (sử dụng << để dịch trái):
const (
_ = iota
KB = 1 << (10 * iota)
MB = 1 << (10 * iota)
GB = 1 << (10 * iota)
TB = 1 << (10 * iota)
PB = 1 << (10 * iota)
)
Nhiều iota trong một dòng:
const (
a, b = iota + 1, iota + 2 //1,2
c, d //2,3
e, f //3,4
)