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!