func HelloGolang() {
fmt.Println("Hello GoLang")
}fmt.Println("Day la" + " " + "string!") // Values
a := 3 // Variables (Type Inference)
const n = 500000000 // Constant (Bất biến)Go chỉ có duy nhất vòng lặp for (không có while, do-while).
for i := 1; i <= 10; i++ {
fmt.Print(i, " ")
}Mảng có độ dài cố định. Matrix là mảng 2 chiều.
// Array 1D
var a [10]int
// Matrix (Array 2D)
var arr2D [10][10]int
arr2D[0][0] = 1Mảng động, linh hoạt hơn Array, dùng append để thêm phần tử.
s := []int{}
s = append(s, 1, 2, 3)Lưu trữ dạng Key-Value. Go không có Set sẵn, thường dùng map[T]bool để giả lập.
// Map
mp := make(map[string]int)
mp["Long"] = 1
// Set (Giả lập)
mySet := make(map[int]bool)
mySet[1] = trueHàm trong Go có thể trả về nhiều giá trị cùng lúc (thường là kết quả + lỗi).
func Tong(a, b int) (int, string) {
return a + b, "OK"
}type User struct {
Name string
Age int
}Hàm gắn liền với Struct. Dùng con trỏ *User nếu muốn sửa dữ liệu gốc.
func (u *User) TangTuoi() {
u.Age++
}Định nghĩa hành vi, không cần từ khóa implements
type HinhHoc interface {
DienTich() float64
}Go không có Enum, dùng type mới + const để giả lập.
type Status string
const ON Status = "ON"Nhúng struct này vào struct khác để tái sử dụng code (Composition over Inheritance).
type Person struct { Name string }
type Student struct {
Person // Embedding: Student có luôn field Name của Person
Code string
}Go không dùng try-catch. Lỗi được trả về như một giá trị bình thường. Hàm trả về gồm kết quả và error nếu có lỗi
if err != nil { fmt.Println(err) }Goroutine là luồng siêu nhẹ. Channel dùng để giao tiếp/trao đổi dữ liệu giữa các luồng.
go func() {
ch <- "Done"
}()
msg := <-ch Dùng để chờ một nhóm Goroutine hoàn thành công việc.
wg.Add(1)
go func() { defer wg.Done(); ... }()
wg.Wait() // Chặn Main lại chờDùng khóa (Lock) để bảo vệ dữ liệu chung khi nhiều luồng cùng sửa, tránh sai lệch số liệu.
mu.Lock() // Khóa cửa
money++ // Sửa an toàn
mu.Unlock() // Mở cửa