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

60 phút

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

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