Cheat sheet Go
Cập nhật lần cuối
Hello World và cấu trúc chương trình
Mọi chương trình Go đều nằm trong một package; điểm bắt đầu là hàm func main trong package main.
| Thao tác | Cú pháp |
|---|---|
| Khai báo package | package main |
| Import một package | import "fmt" |
| Import nhiều package | import (\n "fmt"\n "os"\n) |
| Điểm bắt đầu chương trình | func main() { ... } |
| In ra một dòng | fmt.Println("Hello, World!") |
| In có định dạng | fmt.Printf("%d items\n", n) |
| Chạy một tệp | go run main.go |
| Build ra tệp thực thi | go build |
Biến và kiểu dữ liệu
Go là ngôn ngữ kiểu tĩnh nhưng có thể tự suy luận kiểu với :=.
| Thao tác | Cú pháp |
|---|---|
| Khai báo kèm kiểu | var age int = 30 |
| Khai báo, tự suy luận kiểu | var name = "Ada" |
| Khai báo ngắn | count := 0 |
| Khai báo nhiều biến cùng lúc | x, y := 1, 2 |
| Hằng số | const Pi = 3.14 |
| Giá trị mặc định (zero value) | 0, "", false, nil |
| Kiểu cơ bản | int, float64, string, bool, byte, rune |
| Chuyển đổi kiểu | f := float64(i) |
Luồng điều khiển
Go chỉ có một từ khóa vòng lặp là for, và không đặt điều kiện trong ngoặc tròn.
| Thao tác | Cú pháp |
|---|---|
| If / else | if x > 0 { ... } else { ... } |
| If kèm câu lệnh khởi tạo | if v, ok := m[k]; ok { ... } |
| Vòng lặp for (kiểu C) | for i := 0; i < 10; i++ { ... } |
| Vòng lặp kiểu while | for x < 100 { ... } |
| Vòng lặp vô hạn | for { ... } |
| Duyệt slice bằng range | for i, v := range items { ... } |
| Switch | switch day { case 1: ...; default: ... } |
| Switch không có biểu thức | switch { case x > 0: ... } |
| Break / continue | break, continue |
Hàm
Hàm là giá trị hạng nhất (first-class) và có thể trả về nhiều kết quả.
| Thao tác | Cú pháp |
|---|---|
| Hàm cơ bản | func add(a int, b int) int { return a + b } |
| Tham số chung kiểu | func add(a, b int) int { ... } |
| Trả về nhiều giá trị | func divmod(a, b int) (int, int) { return a / b, a % b } |
| Giá trị trả về có tên | func split(sum int) (x, y int) { x = sum / 2; return } |
| Hàm nhận số lượng tham số tùy ý | func sum(nums ...int) int { ... } |
| Hàm ẩn danh | f := func() { ... } |
| Closure | func counter() func() int { ... } |
| Defer (chạy khi hàm trả về) | defer file.Close() |
Slice và mảng
Mảng có kích thước cố định; slice là một khung nhìn động trên mảng.
| Thao tác | Cú pháp |
|---|---|
| Mảng kích thước cố định | var a [3]int |
| Khởi tạo slice trực tiếp | nums := []int{1, 2, 3} |
| Tạo slice bằng make | s := make([]int, 0, 10) |
| Append | s = append(s, 4) |
| Độ dài / sức chứa | len(s), cap(s) |
| Cắt một slice | s[1:3] |
| Sao chép | copy(dst, src) |
| Duyệt phần tử | for i, v := range s { ... } |
Map
Map là bảng băm (hash table) có sẵn của Go.
| Thao tác | Cú pháp |
|---|---|
| Tạo map bằng make | m := make(map[string]int) |
| Khởi tạo map trực tiếp | m := map[string]int{"a": 1, "b": 2} |
| Gán giá trị | m["c"] = 3 |
| Lấy giá trị | v := m["a"] |
| Kiểm tra khóa có tồn tại | v, ok := m["x"] |
| Xóa một khóa | delete(m, "a") |
| Độ dài | len(m) |
| Duyệt phần tử | for k, v := range m { ... } |
Struct và phương thức
Struct gom các trường lại với nhau; phương thức gắn hành vi vào struct qua receiver.
| Thao tác | Cú pháp |
|---|---|
| Định nghĩa struct | type Point struct { X, Y int } |
| Tạo instance | p := Point{X: 1, Y: 2} |
| Truy cập trường | p.X |
| Con trỏ tới struct | p := &Point{1, 2} |
| Phương thức với value receiver | func (p Point) Dist() float64 { ... } |
| Phương thức với pointer receiver | func (p *Point) Move(dx int) { p.X += dx } |
| Struct nhúng | type Circle struct { Point; R int } |
| Tag của struct | Name string kèm tag json:"name" đặt trong dấu backtick |
Interface
Interface được thỏa mãn ngầm định: kiểu nào có đủ phương thức cần thiết là đạt yêu cầu.
| Thao tác | Cú pháp |
|---|---|
| Định nghĩa interface | type Shape interface { Area() float64 } |
| Hiện thực (ngầm định) | func (c Circle) Area() float64 { ... } |
| Interface rỗng (any) | var x interface{} hoặc var x any |
| Type assertion | s, ok := x.(string) |
| Type switch | switch v := x.(type) { case int: ... } |
| Interface Stringer | func (p Point) String() string { ... } |
Goroutine và channel
Goroutine là luồng nhẹ; channel truyền giá trị giữa các goroutine.
| Thao tác | Cú pháp |
|---|---|
| Khởi chạy goroutine | go doWork() |
| Tạo channel | ch := make(chan int) |
| Channel có bộ đệm | ch := make(chan int, 5) |
| Gửi vào channel | ch <- 42 |
| Nhận từ channel | v := <-ch |
| Đóng channel | close(ch) |
| Duyệt channel bằng range | for v := range ch { ... } |
| Select trên nhiều channel | select { case v := <-ch: ...; default: ... } |
| Wait group | var wg sync.WaitGroup; wg.Add(1); wg.Wait() |
| Mutex | var mu sync.Mutex; mu.Lock(); mu.Unlock() |
Xử lý lỗi
Go trả về lỗi như một giá trị, không có ngoại lệ (exception).
| Thao tác | Cú pháp |
|---|---|
| Trả về lỗi | func read() (string, error) { return "", err } |
| Kiểm tra lỗi | if err != nil { return err } |
| Tạo lỗi | errors.New("not found") |
| Lỗi có định dạng | fmt.Errorf("bad id %d", id) |
| Bọc lỗi | fmt.Errorf("load: %w", err) |
| Mở lỗi / so khớp | errors.Is(err, os.ErrNotExist) |
| So khớp theo kiểu | errors.As(err, &target) |
| Panic / recover | defer func() { recover() }() |
Những cú pháp Go bạn dùng nhiều nhất, gói gọn trong một trang. Cheat sheet Go này là bảng tra cứu nhanh phần cốt lõi của ngôn ngữ: biến và kiểu dữ liệu, slice và map, struct và interface, cùng goroutine và channel, thứ giúp Golang nổi bật về xử lý đồng thời.
Mọi thứ ở đây đều là Go chuẩn và biên dịch được bằng bộ công cụ chính thức. Sao chép đoạn bạn cần, hoặc chạy thử từng đoạn code ngay trong playground Go, không cần cài đặt. Đang học Go? Khóa học Go tương tác miễn phí của Coddy hướng dẫn từng bước về slice, struct, interface và goroutine.
Câu hỏi thường gặp về cheat sheet Go
Cheat sheet Go này có miễn phí không?
Có. Cheat sheet Go này hoàn toàn miễn phí và không cần đăng ký. Lưu trang lại và quay lại bất cứ khi nào bạn cần tra một thao tác với slice, một mẫu dùng channel hay một phương thức của struct.
Trong Go, := và var khác nhau thế nào?
var x = 0 khai báo biến và dùng được ở mọi nơi, kể cả ở cấp package. x := 0 là khai báo biến ngắn: vừa khai báo vừa gán, tự suy luận kiểu, và chỉ dùng được bên trong hàm. Dùng var khi bạn cần ghi rõ kiểu hoặc cần biến cấp package, và := cho các khai báo cục bộ ngắn gọn.Goroutine và channel là gì?
go someFunc(). Channel là đường ống có kiểu giúp các goroutine giao tiếp an toàn: một goroutine gửi bằng ch <- v và goroutine khác nhận bằng <-ch. Kết hợp lại, chúng tạo nên mô hình đồng thời cốt lõi của Go, gói gọn trong câu "chia sẻ bộ nhớ bằng cách giao tiếp."Có thể luyện tập Go online không?
Có. Mở playground Go để chạy bất kỳ đoạn code nào trong cheat sheet này ngay trên trình duyệt, không cần cài bộ công cụ Go. Khi muốn học có lộ trình, khóa học Go tương tác miễn phí của Coddy dẫn bạn từng bước từ biến và slice đến goroutine và channel.
Cheat sheet này có phù hợp cho người mới bắt đầu không?
Có. Nội dung được sắp xếp từ các chủ đề phổ biến nhất (biến, luồng điều khiển, hàm) đến các chủ đề nâng cao (goroutine, channel, xử lý lỗi), nên ngay ngày đầu bạn đã dùng được các phần trên cùng, rồi dần làm chủ phần còn lại.