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

Compiler directive //go: trong Go: từ embed tiện lợi đến linkname nguy hiểm

Chú thích //go: là công tắc điều khiển compiler và linker. Đo thật: go:embed nhúng file vào binary lúc build, go:linkname gọi được hàm runtime riêng (runtime.nanotime), và một khoảng trắng thừa sau // khiến directive bị bỏ qua âm thầm. Cái nào an toàn, cái nào phá an toàn bộ nhớ. Go 1.23.

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

PGO trong Go: compiler dùng profile production để tối ưu, và vì sao benchmark nhỏ không thấy gì

Profile-guided optimization cho compiler dùng profile CPU chạy thật để devirtualize suy đoán những lời gọi interface mà phân tích tĩnh bó tay. Đo thật: PGO devirtualize được h.Chay khi tĩnh không làm được, nhưng benchmark micro gần như không đổi — lợi ích thật là 2-14% trên app lớn. Go 1.23.

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

Go memory model và happens-before: vì sao data race là hành vi không xác định, không phải giá trị cũ

Go memory model định nghĩa khi nào một goroutine nhìn thấy ghi của goroutine khác qua quan hệ happens-before. Đo thật: race detector bắt 2 data race, channel sửa được, và chi phí thiết lập happens-before — mutex 1,5 ns, channel 14,5 ns. Năm quy tắc happens-before. Go 1.23.

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

CAS và cấu trúc lock-free trong Go: một stack không khóa, và sự thật rằng nó chậm hơn mutex

Xây một stack lock-free bằng vòng lặp Compare-And-Swap. Đo thật: nó đúng đắn (10000 phần tử không mất, -race sạch) nhưng dưới tranh chấp cao lại chậm hơn mutex ~3,5 lần vì bão retry. Giá trị của lock-free là bảo đảm tiến triển, không phải tốc độ. Go 1.23.

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

Hàng đợi lock-free Michael-Scott trong Go: mổ xẻ, và vì sao channel vẫn thắng

Xây một hàng đợi lock-free chuẩn Michael-Scott với head/tail riêng, node giả và cơ chế giúp đỡ. Đo thật: nó đúng đắn (8000 phần tử, FIFO, -race sạch) nhưng dưới tranh chấp chậm hơn channel ~3 lần. Vì sao queue khó hơn stack, và khi nào channel là câu trả lời. Go 1.23.