← Về danh sách bài học Bài 3/20

📦 Bài 3: Biến và Kiểu Dữ Liệu

⏱️ Thời gian đọc: 25 phút | 📚 Độ khó: Dễ

🎯 Sau bài học này, bạn sẽ:

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 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?

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:
:= 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++.

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

📝 Bài Tập Thực Hành

Viết chương trình:

  1. 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
  2. In ra tất cả thông tin với format đẹp
  3. 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