Lập trình Go 22/09/2026 10 phút

Benchmark chính xác với benchstat trong Go: một con số đơn lẻ dễ lừa

Chạy go test -bench một lần cho một con số, nhưng máy đầy nhiễu nên nó dao động mỗi lần. So hai phiên bản bằng một con số mỗi bên có thể kết luận sai. benchstat chạy nhiều lần, tính trung bình ± độ lệch, và so hai bản bằng p-value. Đo thật: cải tiến -94.84% (p=0.000) là thật, hàm không đổi báo p=1.000.

Lập trình Go 22/09/2026 10 phút

Cạm bẫy microbenchmark trong Go: trình biên dịch có thể xóa code bạn đo

Trình biên dịch Go tối ưu mạnh: kết quả không dùng bị loại, input hằng số bị tính sẵn — benchmark đo cái không còn chạy, cho số nhỏ hơn thực tế. Đo thật: cùng một hàm, benchmark sai báo 5.5 ns còn benchmark đúng (sink + input biến thiên) báo 9.35 ns — thiếu 41%. Và dấu hiệu nhận biết code bị xóa.

Lập trình Go 22/09/2026 10 phút

Coverage nâng cao trong Go: đo phủ theo hàm, và vì sao 100% không đủ

go test -cover cho một con số tổng, nhưng không nói phần nào chưa phủ. go tool cover -func chỉ ra chính xác hàm/nhánh nào yếu để thêm test. Và cạm bẫy lớn nhất: 100% phủ dòng không bằng test tốt. Đo thật: coverage 75% lên 87.5% có mục tiêu, và một test 100% phủ dòng vẫn để lọt bug giá âm -500.

Lập trình Go 22/09/2026 9 phút

govulncheck trong Go: quét lỗ hổng theo cái code thực sự gọi tới

Scanner thường báo động mọi phụ thuộc dính CVE dù code không dùng hàm lỗi — ngập trong cảnh báo giả. govulncheck phân tích call graph, chỉ báo lỗ hổng code thực sự gọi tới, kèm đường dẫn gọi chính xác. Đo thật: 3 lỗ hổng yaml.v2 code gọi tới (kèm trace + phiên bản vá) so với 42 chỉ-có-không-gọi.

Lập trình Go 22/09/2026 9 phút

staticcheck và golangci-lint trong Go: bắt lỗi go build bỏ qua

go build chỉ bắt lỗi cú pháp và kiểu; nhiều lỗi tinh vi (so sánh thừa, dead store, dùng API sai) lọt qua. staticcheck là bộ linter chất lượng cao, golangci-lint gom nhiều linter vào một. Đo thật: cùng một file, go build sạch, staticcheck bắt 3 lỗi, golangci-lint bắt 4 — thêm cả dead store staticcheck bỏ sót.

Lập trình Go 22/09/2026 9 phút

Continuous profiling trong Go: hồ sơ CPU/bộ nhớ từ dịch vụ đang chạy thật

Benchmark cục bộ chỉ đo cái bạn nghĩ là nóng; điểm nóng production thường ở chỗ bất ngờ với tải và dữ liệu thật. net/http/pprof phơi endpoint để thu hồ sơ từ dịch vụ đang chạy mà không dừng nó. Đo thật trong Go: thu CPU profile 3 giây từ service live, pprof chỉ đúng hàm nóng 100% CPU.