← Về danh sách bài học
Bài 3/20
📦 Bài 3: Biến và Kiểu Dữ Liệu
🎯 Sau bài học này, bạn sẽ:
- Hiểu biến là gì và tại sao cần dùng biến
- Khai báo biến bằng
varvà:= - Biết các kiểu dữ liệu cơ bản trong Go
- Hiểu Zero Values và Type Inference
- Khai báo hằng số với
const
1. Biến Là Gì?
Biến (Variable) giống như một chiếc hộp có tên, dùng để lưu trữ dữ liệu. Bạn có thể đặt giá trị vào hộp, lấy giá trị ra, hoặc thay đổi giá trị bên trong.
📌 Ví dụ thực tế:
• Biến
• Biến
• Biến
• Biến
name lưu tên: "Minh"• Biến
age lưu tuổi: 25• Biến
isStudent lưu trạng thái: true/false
Tại sao cần biến?
- Lưu trữ dữ liệu: Lưu kết quả tính toán, input từ người dùng
- Tái sử dụng: Dùng lại giá trị nhiều lần mà không cần gõ lại
- Dễ thay đổi: Chỉ cần thay đổi một chỗ, tất cả đều cập nhật
2. Khai Báo Biến Trong Go
Cách 1: Dùng từ khóa var
main.go
package main
import "fmt"
func main() {
// Khai báo với kiểu dữ liệu
var name string = "Minh"
var age int = 25
var height float64 = 1.75
var isStudent bool = true
fmt.Println("Tên:", name)
fmt.Println("Tuổi:", age)
fmt.Println("Chiều cao:", height)
fmt.Println("Là sinh viên:", isStudent)
}
Cách 2: Khai báo ngắn gọn với :=
Go có thể tự đoán kiểu dữ liệu dựa vào giá trị bạn gán. Đây là cách được dùng nhiều nhất trong thực tế.
main.go
package main
import "fmt"
func main() {
// Khai báo ngắn gọn - Go tự đoán kiểu
name := "Minh" // string
age := 25 // int
height := 1.75 // float64
isStudent := true // bool
fmt.Println(name, age, height, isStudent)
}
⚠️ Lưu ý quan trọng:
•
•
• Không thể dùng
•
:= chỉ dùng được bên trong hàm•
var có thể dùng ở cả trong và ngoài hàm• Không thể dùng
:= để khai báo lại biến đã tồn tại
Khai báo nhiều biến cùng lúc
// Cách 1: Trên một dòng
var a, b, c int = 1, 2, 3
// Cách 2: Nhóm lại
var (
firstName string = "Minh"
lastName string = "Nguyen"
age int = 25
)
// Cách 3: Khai báo ngắn gọn
x, y, z := 10, 20, 30
3. Các Kiểu Dữ Liệu Cơ Bản
| Kiểu | Mô tả | Ví dụ | Zero Value |
|---|---|---|---|
int |
Số nguyên | -5, 0, 42, 1000 | 0 |
float64 |
Số thực (có phần thập phân) | 3.14, -0.5, 1.0 | 0.0 |
string |
Chuỗi ký tự | "Hello", "Xin chào" | "" (chuỗi rỗng) |
bool |
Đúng hoặc Sai | true, false | false |
Số nguyên (Integers)
// Các loại số nguyên
var a int = 42 // Phổ biến nhất, kích thước phụ thuộc hệ thống
var b int8 = 127 // -128 đến 127
var c int16 = 32767 // -32768 đến 32767
var d int32 = 100000
var e int64 = 9999999999
// Số nguyên không âm (unsigned)
var f uint = 100 // Chỉ số dương
var g uint8 = 255 // 0 đến 255 (byte)
Số thực (Floating-point)
var pi float64 = 3.14159265359
var temperature float32 = 36.5
// Số mũ (scientific notation)
var distance float64 = 1.5e11 // 1.5 × 10^11
Chuỗi (Strings)
// String dùng dấu ngoặc kép
greeting := "Xin chào!"
// String nhiều dòng dùng backtick
message := `Đây là
chuỗi nhiều
dòng`
// Ký tự đặc biệt
newline := "Dòng 1\nDòng 2" // \n = xuống dòng
tab := "Cột 1\tCột 2" // \t = tab
Boolean
isOnline := true
isAdmin := false
// Thường dùng trong điều kiện
if isOnline {
fmt.Println("User đang online")
}
4. Zero Values (Giá Trị Mặc Định)
Trong Go, nếu bạn khai báo biến mà không gán giá trị, Go sẽ tự động gán zero value (giá trị mặc định).
package main
import "fmt"
func main() {
var a int // Zero value: 0
var b float64 // Zero value: 0.0
var c string // Zero value: "" (chuỗi rỗng)
var d bool // Zero value: false
fmt.Printf("int: %d\n", a)
fmt.Printf("float64: %f\n", b)
fmt.Printf("string: '%s'\n", c)
fmt.Printf("bool: %t\n", d)
}
💡 Lợi ích của Zero Values:
Go không cho phép biến không được khởi tạo (uninitialized variables), giúp tránh các lỗi khó debug trong các ngôn ngữ khác như C/C++.
Go không cho phép biến không được khởi tạo (uninitialized variables), giúp tránh các lỗi khó debug trong các ngôn ngữ khác như C/C++.
5. Type Inference (Suy Luận Kiểu)
Type Inference là khả năng Go tự đoán kiểu dữ liệu dựa vào giá trị được gán.
package main
import "fmt"
func main() {
name := "Minh" // Go đoán: string
age := 25 // Go đoán: int
pi := 3.14 // Go đoán: float64
isOk := true // Go đoán: bool
// Kiểm tra kiểu với %T
fmt.Printf("name: %T\n", name) // string
fmt.Printf("age: %T\n", age) // int
fmt.Printf("pi: %T\n", pi) // float64
fmt.Printf("isOk: %T\n", isOk) // bool
}
6. Hằng Số (Constants)
Hằng số là giá trị không thay đổi được sau khi khai báo.
Dùng từ khóa const.
package main
import "fmt"
const PI = 3.14159
const APP_NAME = "My App"
func main() {
const MAX_USERS = 100
fmt.Println("PI:", PI)
fmt.Println("App:", APP_NAME)
fmt.Println("Max users:", MAX_USERS)
// PI = 3.14 // LỖI! Không thể thay đổi hằng số
}
📌 Khi nào dùng const?
• Giá trị toán học: PI, E
• Cấu hình cố định: MAX_SIZE, DEFAULT_PORT
• Các trạng thái: STATUS_OK, STATUS_ERROR
• Giá trị toán học: PI, E
• Cấu hình cố định: MAX_SIZE, DEFAULT_PORT
• Các trạng thái: STATUS_OK, STATUS_ERROR
📝 Bài Tập Thực Hành
Viết chương trình:
- Khai báo biến để lưu thông tin sinh viên: tên, tuổi, điểm trung bình, là sinh viên giỏi không
- In ra tất cả thông tin với format đẹp
- Dùng
%Tđể in ra kiểu của mỗi biến
👀 Xem đáp án
package main
import "fmt"
func main() {
// Thông tin sinh viên
name := "Nguyen Van A"
age := 20
gpa := 8.5
isHonor := true
// In thông tin
fmt.Println("=== THÔNG TIN SINH VIÊN ===")
fmt.Printf("Họ tên: %s (%T)\n", name, name)
fmt.Printf("Tuổi: %d (%T)\n", age, age)
fmt.Printf("Điểm TB: %.2f (%T)\n", gpa, gpa)
fmt.Printf("Sinh viên giỏi: %t (%T)\n", isHonor, isHonor)
}
📝 Tóm Tắt Bài Học
- Biến là nơi lưu trữ dữ liệu với một tên
- Khai báo:
var name type = valuehoặcname := value - Kiểu cơ bản:
int,float64,string,bool - Zero values: Go tự gán giá trị mặc định (0, "", false)
- Type inference: Go tự đoán kiểu khi dùng
:= - Hằng số: Dùng
constcho giá trị không đổi