🛠️ Dụng Cụ Bếp - Go Tools
Trong nhà hàng, dụng cụ bếp tốt giúp đầu bếp làm việc hiệu quả hơn. Tương tự, Go cung cấp nhiều công cụ mạnh mẽ giúp lập trình viên viết code sạch, tìm lỗi nhanh và quản lý dự án dễ dàng.
1. Go Fmt - Sắp Xếp Bếp Gọn Gàng
go fmt giống như việc sắp xếp lại bếp sau mỗi ca làm việc - mọi thứ được đặt đúng vị trí, gọn gàng và nhất quán.
Ví dụ: Code Chưa Format
package main
import "fmt"
func main(){
var name    string="Phở Bò"
        var price float64=45000
    fmt.Printf("Món: %s - Giá: %.0f\n",name,price)
}
Chạy Go Fmt
go fmt main.go
Code Sau Khi Format
package main
import "fmt"
func main() {
	var name string = "Phở Bò"
	var price float64 = 45000
	fmt.Printf("Món: %s - Giá: %.0f\n", name, price)
}
Lưu ý: go fmt tự động căn chỉnh tab, dấu cách và xuống dòng theo chuẩn Go.
2. Go Vet - Kiểm Tra Dụng Cụ
go vet giống như việc kiểm tra dao có sắc, nồi có sạch trước khi nấu - nó phát hiện các lỗi tiềm ẩn trong code.
Ví dụ: Lỗi Printf Sai Định Dạng
package main
import "fmt"
func main() {
	dish := "Bún Chả"
	price := 35000
	// Sai: %s với số, %d với chuỗi
	fmt.Printf("Món: %d - Giá: %s đồng\n", dish, price)
}
Chạy Go Vet
go vet main.go
Kết Quả
# command-line-arguments
./main.go:8:2: Printf format %d has arg dish of wrong type string
./main.go:8:2: Printf format %s has arg price of wrong type int
Go vet phát hiện:
- Định dạng %d(số) nhưng đối số làstring
- Định dạng %s(chuỗi) nhưng đối số làint
3. Go Mod - Quản Lý Nguyên Liệu
go mod giống như sổ quản lý nguyên liệu trong nhà hàng - theo dõi những thư viện (nguyên liệu) nào cần thiết cho dự án.
Khởi Tạo Module
# Tạo module mới
go mod init restaurant-app
# Tạo file go.mod
File go.mod
module restaurant-app
go 1.21
require (
	github.com/gin-gonic/gin v1.9.1
	github.com/lib/pq v1.10.9
)
Các Lệnh Go Mod Quan Trọng
# Tải các dependency về
go mod download
# Thêm dependency còn thiếu, xóa dependency không dùng
go mod tidy
# Sao chép dependency vào thư mục vendor
go mod vendor
# Kiểm tra dependency
go mod verify
Ví dụ: Thêm Dependency
package main
import (
	"fmt"
	"github.com/gin-gonic/gin"
)
func main() {
	r := gin.Default()
	r.GET("/menu", func(c *gin.Context) {
		c.JSON(200, gin.H{
			"dish":  "Phở Bò",
			"price": 45000,
		})
	})
	fmt.Println("Nhà hàng đang mở cửa tại :8080")
	r.Run(":8080")
}
# Chạy code sẽ tự động tải gin về
go run main.go
# Hoặc tải thủ công
go get github.com/gin-gonic/gin
4. Delve - Kính Lúp Kiểm Tra Món
Delve là debugger mạnh mẽ của Go - giống như kính lúp giúp đầu bếp kiểm tra từng chi tiết của món ăn.
Cài Đặt Delve
go install github.com/go-delve/delve/cmd/dlv@latest
Ví dụ: Debug Tính Tổng Bill
package main
import "fmt"
func calculateTotal(dishes []float64) float64 {
	total := 0.0
	for _, price := range dishes {
		total += price
	}
	return total
}
func main() {
	menu := []float64{45000, 35000, 25000}
	total := calculateTotal(menu)
	fmt.Printf("Tổng bill: %.0f đồng\n", total)
}
Chạy Debug
# Bắt đầu debug session
dlv debug main.go
# Trong dlv prompt:
(dlv) break main.calculateTotal    # Đặt breakpoint
(dlv) continue                      # Chạy đến breakpoint
(dlv) print dishes                  # Xem giá trị biến
(dlv) next                          # Chạy dòng tiếp theo
(dlv) step                          # Bước vào hàm
(dlv) quit                          # Thoát
5. Go Build - Đóng Gói Món Ăn
go build biên dịch code thành file thực thi - giống như đóng gói món ăn để mang đi.
Build Cơ Bản
# Build file hiện tại
go build main.go
# Chạy file đã build
./main
Build Với Tên Tùy Chỉnh
# Build với tên output
go build -o restaurant-app main.go
# Chạy
./restaurant-app
Build Cho Hệ Điều Hành Khác (Cross-compilation)
# Build cho Windows từ Linux/Mac
GOOS=windows GOARCH=amd64 go build -o restaurant.exe main.go
# Build cho Linux từ Windows/Mac
GOOS=linux GOARCH=amd64 go build -o restaurant-linux main.go
# Build cho Mac từ Windows/Linux
GOOS=darwin GOARCH=amd64 go build -o restaurant-mac main.go
6. Go Test - Thử Vị Món Ăn
go test chạy các test cases - giống như đầu bếp nếm thử món trước khi phục vụ khách.
File Code: menu.go
package menu
func CalculateDiscount(total float64, percent int) float64 {
	if percent < 0 || percent > 100 {
		return total
	}
	discount := total * float64(percent) / 100
	return total - discount
}
File Test: menu_test.go
package menu
import "testing"
func TestCalculateDiscount(t *testing.T) {
	// Test giảm 10%
	result := CalculateDiscount(100000, 10)
	expected := 90000.0
	if result != expected {
		t.Errorf("Giảm 10%% cho 100k: mong đợi %.0f, nhận được %.0f",
			expected, result)
	}
	// Test phần trăm không hợp lệ
	result = CalculateDiscount(100000, -5)
	if result != 100000 {
		t.Errorf("Phần trăm âm: phải trả về giá gốc")
	}
}
Chạy Test
# Chạy tất cả test
go test
# Chạy test với thông tin chi tiết
go test -v
# Chạy test và hiển thị coverage
go test -cover
# Tạo báo cáo coverage HTML
go test -coverprofile=coverage.out
go tool cover -html=coverage.out
7. Go Doc - Sổ Tay Công Thức
go doc xem tài liệu của packages và functions - giống như sổ tay công thức trong bếp.
Xem Tài Liệu Package
# Xem doc của package fmt
go doc fmt
# Xem doc của hàm Printf
go doc fmt.Printf
# Xem doc của package hiện tại
go doc
Viết Documentation
package menu
// Dish đại diện cho một món ăn trong nhà hàng.
// Mỗi món có tên, giá và thể loại.
type Dish struct {
	// Name là tên món ăn (VD: "Phở Bò", "Bún Chả")
	Name string
	// Price là giá tiền tính bằng VNĐ
	Price float64
	// Category là loại món (VD: "Món chính", "Khai vị")
	Category string
}
// NewDish tạo một món ăn mới với thông tin đầy đủ.
// Trả về con trỏ tới Dish đã tạo.
//
// Ví dụ:
//   pho := NewDish("Phở Bò", 45000, "Món chính")
func NewDish(name string, price float64, category string) *Dish {
	return &Dish{
		Name:     name,
		Price:    price,
		Category: category,
	}
}
Chạy Doc Server
# Khởi động server documentation
godoc -http=:6060
# Mở browser tại http://localhost:6060
8. Go Get - Đặt Hàng Nguyên Liệu
go get tải và cài đặt packages - giống như đặt hàng nguyên liệu từ nhà cung cấp.
Cài Đặt Package
# Cài đặt package mới nhất
go get github.com/gin-gonic/gin
# Cài đặt version cụ thể
go get github.com/gin-gonic/[email protected]
# Cập nhật package
go get -u github.com/gin-gonic/gin
# Cài đặt tất cả dependencies
go get ./...
Ví dụ: Sử Dụng Package Bên Ngoài
package main
import (
	"fmt"
	"github.com/google/uuid"
)
type Order struct {
	ID    string
	Dish  string
	Price float64
}
func createOrder(dish string, price float64) Order {
	// Tạo ID duy nhất cho đơn hàng
	orderID := uuid.New().String()
	return Order{
		ID:    orderID,
		Dish:  dish,
		Price: price,
	}
}
func main() {
	order := createOrder("Phở Bò", 45000)
	fmt.Printf("Đơn hàng #%s\n", order.ID)
	fmt.Printf("Món: %s - Giá: %.0f đồng\n", order.Dish, order.Price)
}
# Tải uuid package
go get github.com/google/uuid
# Chạy code
go run main.go
9. Go Install - Cài Đặt Công Cụ Toàn Hệ Thống
go install cài đặt binary vào $GOPATH/bin - giống như mua thiết bị bếp chuyên dụng để dùng lâu dài.
Cài Đặt Tool
# Cài đặt delve debugger
go install github.com/go-delve/delve/cmd/dlv@latest
# Cài đặt goimports (auto import packages)
go install golang.org/x/tools/cmd/goimports@latest
# Cài đặt staticcheck (linter mạnh)
go install honnef.co/go/tools/cmd/staticcheck@latest
Sử Dụng Goimports
Code thiếu import:
package main
func main() {
	fmt.Println("Phở Bò - 45000 đồng")
	http.ListenAndServe(":8080", nil)
}
Chạy goimports:
goimports -w main.go
Code sau khi auto import:
package main
import (
	"fmt"
	"net/http"
)
func main() {
	fmt.Println("Phở Bò - 45000 đồng")
	http.ListenAndServe(":8080", nil)
}
Kiểm Tra Tool Đã Cài
# Liệt kê các tool trong $GOPATH/bin
ls $GOPATH/bin
# Hoặc trên Windows
dir %GOPATH%\bin
Tổng Kết Dụng Cụ Bếp
| Công Cụ | Chức Năng | Ẩn Dụ Nhà Hàng | 
|---|---|---|
| go fmt | Format code tự động | Sắp xếp bếp gọn gàng | 
| go vet | Phát hiện lỗi tiềm ẩn | Kiểm tra dụng cụ | 
| go mod | Quản lý dependencies | Quản lý nguyên liệu | 
| delve | Debug code | Kính lúp kiểm tra món | 
| go build | Biên dịch code | Đóng gói món ăn | 
| go test | Chạy test cases | Thử vị món ăn | 
| go doc | Xem documentation | Sổ tay công thức | 
| go get | Tải packages | Đặt hàng nguyên liệu | 
| go install | Cài tools toàn cục | Mua thiết bị bếp chuyên dụng | 
Thực hành tốt:
- Luôn chạy go fmttrước khi commit code
- Dùng go vetđể phát hiện lỗi sớm
- Chạy go mod tidythường xuyên để giữ dependencies sạch
- Viết test và dùng go test -coverđể kiểm tra coverage
- Dùng delvekhi gặp bug khó tìm
Tiếp theo: Tìm hiểu Design Patterns - các mẫu thiết kế phổ biến trong Go.