Chuyển tới nội dung chính

🛠️ 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 fmtFormat code tự độngSắp xếp bếp gọn gàng
go vetPhát hiện lỗi tiềm ẩnKiểm tra dụng cụ
go modQuản lý dependenciesQuản lý nguyên liệu
delveDebug codeKính lúp kiểm tra món
go buildBiên dịch codeĐóng gói món ăn
go testChạy test casesThử vị món ăn
go docXem documentationSổ tay công thức
go getTải packagesĐặt hàng nguyên liệu
go installCài tools toàn cụcMua thiết bị bếp chuyên dụng

Thực hành tốt:

  • Luôn chạy go fmt trước khi commit code
  • Dùng go vet để phát hiện lỗi sớm
  • Chạy go mod tidy thường xuyên để giữ dependencies sạch
  • Viết test và dùng go test -cover để kiểm tra coverage
  • Dùng delve khi 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.