Menu
CoddyTech

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ácCú pháp
Khai báo packagepackage main
Import một packageimport "fmt"
Import nhiều packageimport (\n "fmt"\n "os"\n)
Điểm bắt đầu chương trìnhfunc main() { ... }
In ra một dòngfmt.Println("Hello, World!")
In có định dạngfmt.Printf("%d items\n", n)
Chạy một tệpgo run main.go
Build ra tệp thực thigo 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ácCú pháp
Khai báo kèm kiểuvar age int = 30
Khai báo, tự suy luận kiểuvar name = "Ada"
Khai báo ngắncount := 0
Khai báo nhiều biến cùng lúcx, y := 1, 2
Hằng sốconst Pi = 3.14
Giá trị mặc định (zero value)0, "", false, nil
Kiểu cơ bảnint, float64, string, bool, byte, rune
Chuyển đổi kiểuf := 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ácCú pháp
If / elseif x > 0 { ... } else { ... }
If kèm câu lệnh khởi tạoif 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 whilefor x < 100 { ... }
Vòng lặp vô hạnfor { ... }
Duyệt slice bằng rangefor i, v := range items { ... }
Switchswitch day { case 1: ...; default: ... }
Switch không có biểu thứcswitch { case x > 0: ... }
Break / continuebreak, 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ácCú pháp
Hàm cơ bảnfunc add(a int, b int) int { return a + b }
Tham số chung kiểufunc 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ênfunc 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 danhf := func() { ... }
Closurefunc 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ácCú pháp
Mảng kích thước cố địnhvar a [3]int
Khởi tạo slice trực tiếpnums := []int{1, 2, 3}
Tạo slice bằng makes := make([]int, 0, 10)
Appends = append(s, 4)
Độ dài / sức chứalen(s), cap(s)
Cắt một slices[1:3]
Sao chépcopy(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ácCú pháp
Tạo map bằng makem := make(map[string]int)
Khởi tạo map trực tiếpm := 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ạiv, ok := m["x"]
Xóa một khóadelete(m, "a")
Độ dàilen(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ácCú pháp
Định nghĩa structtype Point struct { X, Y int }
Tạo instancep := Point{X: 1, Y: 2}
Truy cập trườngp.X
Con trỏ tới structp := &Point{1, 2}
Phương thức với value receiverfunc (p Point) Dist() float64 { ... }
Phương thức với pointer receiverfunc (p *Point) Move(dx int) { p.X += dx }
Struct nhúngtype Circle struct { Point; R int }
Tag của structName 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ácCú pháp
Định nghĩa interfacetype 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 assertions, ok := x.(string)
Type switchswitch v := x.(type) { case int: ... }
Interface Stringerfunc (p Point) String() string { ... }

Goroutine và channel

Goroutine là luồng nhẹ; channel truyền giá trị giữa các goroutine.

Thao tácCú pháp
Khởi chạy goroutinego doWork()
Tạo channelch := make(chan int)
Channel có bộ đệmch := make(chan int, 5)
Gửi vào channelch <- 42
Nhận từ channelv := <-ch
Đóng channelclose(ch)
Duyệt channel bằng rangefor v := range ch { ... }
Select trên nhiều channelselect { case v := <-ch: ...; default: ... }
Wait groupvar wg sync.WaitGroup; wg.Add(1); wg.Wait()
Mutexvar 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ácCú pháp
Trả về lỗifunc read() (string, error) { return "", err }
Kiểm tra lỗiif err != nil { return err }
Tạo lỗierrors.New("not found")
Lỗi có định dạngfmt.Errorf("bad id %d", id)
Bọc lỗifmt.Errorf("load: %w", err)
Mở lỗi / so khớperrors.Is(err, os.ErrNotExist)
So khớp theo kiểuerrors.As(err, &target)
Panic / recoverdefer 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ì?
Goroutine là một luồng nhẹ do runtime của Go quản lý; bạn khởi chạy một goroutine bằng cách viết 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.

Hình minh họa các ngôn ngữ lập trình của Coddy

Học Go cùng Coddy

Bắt đầu