📖 Golang Toàn tập - Biến, Kiểu dữ liệu và Control Flow
60 phút

Biến, Kiểu dữ liệu và Control Flow trong Go

Khai báo biến

Các cách khai báo

package main

import "fmt"

func main() {
    // Cách 1: var với type
    var name string = "John"
    var age int = 30

    // Cách 2: var với type inference
    var city = "Hanoi"

    // Cách 3: short declaration (chỉ trong function)
    country := "Vietnam"

    // Khai báo nhiều biến
    var x, y int = 1, 2
    a, b := 3, 4

    // Zero values
    var zeroInt int      // 0
    var zeroString string // ""
    var zeroBool bool     // false

    fmt.Println(name, age, city, country, x, y, a, b)
    fmt.Println(zeroInt, zeroString, zeroBool)
}

Constants

const Pi = 3.14159

const (
    StatusOK       = 200
    StatusNotFound = 404
)

// iota cho enum
type Weekday int

const (
    Sunday Weekday = iota
    Monday
    Tuesday
    Wednesday
)

Kiểu dữ liệu cơ bản

Numeric types

var i int = 42
var i8 int8 = 127
var i16 int16 = 32767
var i32 int32 = 2147483647
var i64 int64 = 9223372036854775807

var u uint = 42
var f32 float32 = 3.14
var f64 float64 = 3.14159265359

String

s := "Hello"
// Raw string literal
raw := `Multi
line
string`

// String operations
len(s)                  // 5
s + ", World!"          // concatenation
s[0]                    // byte 'H'
[]rune(s)              // convert to runes

Arrays và Slices

// Array có fixed size
var arr [5]int
arr[0] = 1

// Array literal
nums := [3]int{1, 2, 3}

// Slice - dynamic size
slice := []int{1, 2, 3}
slice = append(slice, 4, 5)

// Make slice
s := make([]int, 5)      // length 5
s2 := make([]int, 0, 10) // length 0, capacity 10

Maps

// Khai báo map
var m map[string]int
m = make(map[string]int)

// Map literal
scores := map[string]int{
    "Alice": 95,
    "Bob":   87,
}

// Thêm, đọc, xóa
scores["Charlie"] = 92
score := scores["Alice"]
delete(scores, "Bob")

// Check existence
value, ok := scores["David"]
if !ok {
    fmt.Println("Not found")
}

Structs

type User struct {
    ID    int
    Name  string
    Email string
}

func main() {
    u := User{
        ID:    1,
        Name:  "John",
        Email: "john@example.com",
    }
    
    fmt.Println(u.Name)
    
    // Pointer to struct
    p := &u
    p.Name = "Jane"
}

Control Flow

if/else

if age := 20; age >= 18 {
    fmt.Println("Adult")
} else {
    fmt.Println("Minor")
}

for loop

// C-style for
for i := 0; i < 5; i++ {
    fmt.Println(i)
}

// While-style
i := 0
for i < 5 {
    i++
}

// Infinite loop
for {
    // break để thoát
}

// Range loop
nums := []int{1, 2, 3}
for index, value := range nums {
    fmt.Printf("Index: %d, Value: %d\n", index, value)
}

// Range với map
scores := map[string]int{"Alice": 95}
for name, score := range scores {
    fmt.Printf("%s: %d\n", name, score)
}

switch

switch day := "Monday"; day {
case "Monday", "Tuesday":
    fmt.Println("Early week")
case "Friday":
    fmt.Println("TGIF!")
default:
    fmt.Println("Regular day")
}

// Switch không có condition
score := 85
switch {
case score >= 90:
    fmt.Println("A")
case score >= 80:
    fmt.Println("B")
default:
    fmt.Println("C")
}

Bài tập thực hành

Hãy viết chương trình xử lý dữ liệu với slices và maps!

📝 Bài tập (1)

  1. Viết các hàm xử lý slice