Golang: Zero to Hero
Sê-ri 60 bài đi từ cú pháp Go cơ bản tới đồng thời, thư viện chuẩn và đưa ứng dụng lên sản xuất. Mỗi bài có ví dụ chạy được và số đo thật.
60/60 phần đã đăng
Go
1
Go sinh ra từ một bản build 45 phút — 48ms và một tệp tĩnh là toàn bộ triết lý của nó
Go như một bếp có thực đơn ngắn cố tình: ít món hơn, nhưng đầu bếp nào cũng làm được mọi món y như nhau và nhanh. Ba con số giải thích vì sao nó chiếm mảng hạ tầng: build 48ms, binary tĩnh, cross-compile một lệnh — và cái giá phải trả.
14/06/2026
· 7 phút đọc
2
go run chậm hơn ./app sáu mươi lần — và vì sao đừng bao giờ chạy go run trên máy chủ
go run như nấu lại món từ đầu mỗi lần muốn ăn, go build là nấu sẵn để trong hộp. Cài Go, viết chương trình đầu tiên, và hiểu chính xác hai lệnh khác nhau chỗ nào bằng số đo thật.
15/06/2026
· 7 phút đọc
3
Package là một thư mục, module là thứ được đánh phiên bản — và vì sao Go chọn phiên bản THẤP nhất
Package như một chương sách, module như cả cuốn sách có mã ISBN; go.mod là trang ghi xuất bản liệt kê ấn bản của sách khác nó trích, go.sum là dấu vân tay chống sửa. Phân biệt hai khái niệm, và Minimal Version Selection.
16/06/2026
· 7 phút đọc
4
Đọc một map rỗng trong Go không bao giờ crash, nhưng ghi vào thì panic — và triết lý zero value đằng sau
Mỗi biến Go như một phòng khách sạn đã dọn sẵn: nhận là dùng được ngay, không có rác bộ nhớ như C. var và :=, vì sao Go cấm ép kiểu ngầm, tràn số im lặng, và hằng không kiểu chính xác tuỳ ý.
17/06/2026
· 8 phút đọc
5
string(65) ra 'A' chứ không phải '65', và int(-3.99) là -3: chuyển kiểu Go không đoán ý giùm bạn
Một con số trên cái nhãn có thể là SỐ LƯỢNG hay một MÃ TRA BẢNG — và đổi nó sang chữ là hai việc khác hẳn. Cắt cụt về phía 0, cuộn vòng im lặng khi thu hẹp, strconv là cửa duy nhất giữa chuỗi và số, và cái gì so được bằng dấu bằng.
18/06/2026
· 6 phút đọc
6
Cùng một vòng lặp, Go 1.21 in '3 3 3' còn 1.22 in '0 1 2' — và vì sao go.mod quyết định, không phải trình biên dịch
Go cố tình cho bạn một hộp đồ nghề điều khiển luồng nhỏ: một for làm việc của while/do-while/foreach, switch không cần break. Và một dòng trong go.mod âm thầm đổi nghĩa của mã đã viết.
19/06/2026
· 7 phút đọc
7
Hàm Go trả về cả khay nhiều ngăn — và vì sao bạn phải gõ thêm một ký tự để lờ lỗi đi
Cửa sổ phục vụ của hầu hết ngôn ngữ trả qua khe một món; của Go trả cả khay nhiều ngăn — món chính một ngăn, phiếu tình trạng một ngăn. Nhiều giá trị trả về, named return nên tránh, variadic, closure, và vì sao Go không có nạp chồng.
20/06/2026
· 6 phút đọc
8
Gọi Tăng() một trăm lần mà bộ đếm vẫn là 0 — con trỏ, receiver, và bản photocopy trong Go
Truyền struct theo giá trị như đưa người ta một bản photocopy — họ viết lên, bản gốc không suy suyển. Con trỏ là đưa địa chỉ bản gốc. Có & và *, không có số học con trỏ, và khi nào Go tự lấy địa chỉ giúp.
21/06/2026
· 7 phút đọc
9
append vào slice này lại ghi đè dữ liệu slice kia — cái bẫy chia sẻ mảng nền, và ba cách tránh
Slice như cặp thẻ đánh dấu một khoảng trang của cuốn sách dùng chung: cắt slice chỉ là đặt thẻ mới trên cùng cuốn sách, không sao chép. Ba con số của slice, hai chế độ append, và cái bẫy chia sẻ bộ nhớ đo bằng một ví dụ năm phần tử.
22/06/2026
· 7 phút đọc
10
Đọc map nil thì yên, ghi map nil thì chết — và ba chỗ map Go khác HashMap đủ gây bất ngờ
Map như phòng gửi đồ có móc dán nhãn: comma-ok hỏi 'móc này có áo hay chỉ trống', map nil là phòng chưa dựng nên đọc được mà treo áo thì panic. Thứ tự duyệt ngẫu nhiên có chủ đích, và ghi đồng thời thì chết hẳn.
23/06/2026
· 7 phút đọc
11
Cùng ba trường, đổi thứ tự thì struct nhẹ đi 33% — và vì sao luôn khởi tạo theo tên
Struct như một khay đựng có nhiều ngăn dán nhãn: điền theo nhãn mới an toàn, điền theo vị trí là đặt bẫy. Struct rỗng chiếm 0 byte, so sánh bằng dấu bằng, nhúng không phải kế thừa, và vì sao thứ tự khai báo trường có giá.
24/06/2026
· 6 phút đọc
12
Vì sao gán giá trị vào interface báo 'does not implement' còn gán con trỏ thì không — quy tắc method set
Method receiver giá trị như đọc một tài liệu (bản photo cũng được); receiver con trỏ như ký sửa nó (cần bản gốc). Method gắn ngoài kiểu, method set khác nhau giữa giá trị và con trỏ, và vì sao khác biệt đó chỉ lộ ra khi gán vào interface.
25/06/2026
· 6 phút đọc
13
Go không có 'implements' — interface là bản mô tả công việc do người DÙNG viết, và nó đảo ngược cả quan hệ phụ thuộc
Java bắt bạn cầm thẻ hội viên 'implements'; Go thì interface là bản mô tả công việc do người dùng viết, ai làm được việc là đủ tư cách. Vì sao interface nên nhỏ, nên khai ở phía người dùng, và cách kiểm lúc biên dịch.
26/06/2026
· 7 phút đọc
14
Cái hộp không dán nhãn của Go: vì sao x.(int) là dòng panic chờ sẵn, và khi nào any là lỗi thiết kế
any là cửa thoát khỏi hệ thống kiểu — như một cái hộp không nhãn: thứ gì cũng bỏ vừa, nhưng mở ra phải đoán. Hai dạng type assertion, type switch, và vì sao dùng any nhiều gần như luôn là thiết kế sai.
27/06/2026
· 7 phút đọc
15
Embedding của Go trông y hệt kế thừa — trừ cái quan trọng nhất: không có dispatch động
Nhúng một kiểu như thuê trợ lý rồi in số của họ lên danh thiếp mình: method được thăng cấp, nhưng bạn không PHẢI là họ, và khi họ tự làm việc thì không ngước lên gọi bạn. Che method, nhúng interface, và bẫy mơ hồ khi nhúng hai kiểu.
28/06/2026
· 6 phút đọc
16
Generics trong Go: dấu ngã ~ bạn hay quên mới là thứ quyết định hàm dùng được cho bao nhiêu kiểu
Hàm generic như một cái khuôn có ô trống chừa sẵn cho kiểu; constraint là tờ quy cách liệt kê đúng những vật liệu vừa khuôn. Tham số kiểu, ý nghĩa của ~, và ba chỗ nên dùng cùng ba chỗ không nên.
29/06/2026
· 7 phút đọc
17
Con trỏ nil bỏ vào interface thì interface không còn nil — cái bẫy khiến request bình thường trả lỗi 500
Interface như một kiện hàng có nhãn người gửi: nil thật là KHÔNG có kiện nào; bỏ con trỏ nil vào là một kiện rỗng ruột nhưng vẫn dán nhãn '*Meo'. Cơ chế cặp (kiểu, giá trị), chỗ nó cắn khi trả về error, và ba cách phòng.
30/06/2026
· 7 phút đọc
18
`var x` rồi dùng ngay có chạy không — câu hỏi tách mã Go viết như Go khỏi viết như Java
Kiểu tốt trong Go như đồ dùng-được-ngay-khỏi-hộp: khai ra là chạy, không cần lắp ráp. Cách thiết kế API quanh zero value, cái bẫy map nil, và một câu hỏi kiểm mọi kiểu bạn viết.
01/07/2026
· 6 phút đọc
19
Toàn bộ kiểm soát truy cập của Go nằm ở một chữ cái viết hoa — và vì sao JSON âm thầm nuốt trường của bạn
Một package là một ngôi nhà: tên viết hoa được ra đường, viết thường ở trong nhà, nhưng người cùng nhà thấy nhau hết. Quy tắc chữ hoa, thư mục internal, và hệ quả bất ngờ với JSON và phản chiếu.
02/07/2026
· 6 phút đọc
20
Go dựng sân khấu theo đúng thứ tự phụ thuộc trước khi main() mở màn — và vì sao vẫn nên tránh init()
Trước khi màn kéo lên (main), một chuỗi cố định chạy: đạo cụ của package import dựng xong trước, cảnh trí đặt theo phụ thuộc chứ không theo thứ tự viết, rồi mới tới checklist init(). Thứ tự thật đo bằng output, và bốn lý do tránh init().
03/07/2026
· 6 phút đọc
21
Bắt đầu bằng một tệp, và tách theo miền chứ không theo tầng — cái repo 40 nghìn sao không phải chuẩn
Tổ chức dự án như sắp xưởng đồ nghề: gom theo CÔNG VIỆC, không gom theo VẬT LIỆU, và đừng đóng tủ bốn mươi ngăn cho một hộp đồ nghề. cmd và internal dùng làm gì, ba dấu hiệu đã đến lúc tách package, và vì sao phụ thuộc vòng là lỗi biên dịch.
04/07/2026
· 7 phút đọc
22
len('Tiếng Việt') = 14 chứ không phải 10 — và vì sao mọi hàm cắt chuỗi tiếng Việt của bạn cần xem lại
Chuỗi Go là một dây hạt cườm: mỗi byte một hạt, chữ 'ế' là ba hạt xâu thành một ký tự. s[i] đưa bạn một hạt lẻ, cắt giữa chừng làm gãy đôi chữ có dấu, và range mới đi theo từng ký tự.
05/07/2026
· 7 phút đọc
23
Go biến lỗi thành tờ phiếu trao tay — và đó là lý do bạn gõ if err != nil khắp nơi
Exception như chuông báo cháy giật bạn ra khỏi toà nhà; error của Go là tờ phiếu giao kèm mỗi lần trao việc — bạn cầm trên tay và phải tự quyết. Vì sao Go chọn vậy, và bốn mẫu xử lý lỗi gõ hằng ngày.
06/07/2026
· 6 phút đọc
24
%v và %w in ra y hệt nhau — nhưng một trong hai lặng lẽ cắt đứt cây lỗi của bạn
Bọc lỗi như đóng thùng lồng nhau, mỗi tầng dán nhãn riêng nhưng mã vạch gốc phải còn quét được. %w giữ thùng, %v chỉ chụp cái nhãn rồi vứt thùng đi. errors.Is so danh tính, errors.As lấy lại kiểu, và cái bẫy một ký tự.
07/07/2026
· 7 phút đọc
25
panic không phải throw, recover không phải catch — và panic trong goroutine giết cả chương trình
panic như nút DỪNG KHẨN của máy: dành cho hỏng hóc cấu trúc chứ không phải chi tiết không vừa, chạy trình tắt rồi ngừng. recover chỉ làm việc từ chòi điều khiển (defer), và mỗi goroutine phải tự lo nút của mình. Ba chỗ được phép panic, ba chỗ được phép recover.
08/07/2026
· 6 phút đọc
26
defer chụp ảnh đối số ngay lúc viết — và vì sao mẫu đo thời gian bằng defer của bạn luôn ra ~0
defer như mẩu nhắc bạn bỏ vào hộp lúc đi ra: lấy ra theo thứ tự ngược, và nội dung bị chụp ảnh ngay lúc viết. Thứ tự LIFO, đối số tính ngay, defer sửa được named return, và cái bẫy defer trong vòng lặp.
09/07/2026
· 7 phút đọc
27
Kiểu lỗi của bạn là API công khai — và bỏ Unwrap làm mọi errors.Is thất bại trong im lặng
Lỗi như cái thẻ hành lý: sentinel là cái thẻ màu ai cũng nhận ra, kiểu lỗi riêng là thẻ ghi chi tiết người gọi bóc ra dùng được. Unwrap giữ thẻ cũ để lần được nguồn, và ngay khi ai đó đọc trường của lỗi, cấu trúc nó thành hợp đồng.
10/07/2026
· 6 phút đọc
28
Log lỗi ở mọi tầng là bốn dòng cho một sự cố — chỉ tầng ngoài cùng được log
Một lỗi đi lên như một sự việc leo thang qua các cấp: mỗi cấp thêm ngữ cảnh nó biết rồi đẩy lên, chỉ cấp trên cùng lập một biên bản và ra một câu trả lời. Bọc ở đâu, log ở đâu, tách lỗi nghiệp vụ khỏi lỗi hệ thống, và đừng để lộ nội tình ra API.
11/07/2026
· 6 phút đọc
29
Một lời gọi cancel() dừng cả cây goroutine — context, hạn chờ, và vì sao 'người dùng bỏ đi' không phải lỗi
context như sợi dây chỉ huy của một đoàn tìm kiếm: chỉ huy hô 'thu quân' là lệnh truyền xuống mọi đội con. Huỷ lan xuống cả cây, con hết hạn trước cha, phân biệt Canceled với DeadlineExceeded, và vì sao WithValue nên dùng rất dè.
12/07/2026
· 7 phút đọc
30
defer f.Close() âm thầm nuốt lỗi ghi đĩa — và vì sao 'đã ghi xong' không phải 'đã lưu'
Write như bỏ thư vào thùng; thư chỉ thật sự đi khi bưu điện gửi — và lỗi đĩa đầy chỉ lộ ra lúc Close. Mẫu bắt lỗi Close bằng named return, đóng body HTTP, và đóng hai lần thì sao.
13/07/2026
· 7 phút đọc
31
Một goroutine tốn 2,47µs và 576 byte: vì sao Go không cần pool, và Java mất tới 2023 mới đuổi kịp
Goroutine như thêm một bàn trong nhà hàng, còn luồng hệ điều hành như thuê thêm bồi bàn; GOMAXPROCS là số bồi bàn thật. Đo chi phí tạo và giữ goroutine, so với luồng Java, và bộ lập lịch M:N đứng sau.
14/07/2026
· 7 phút đọc
32
Channel không đệm là cuộc bắt tay, không phải hàng đợi — và vì sao đệm lớn 'cho chắc' là cái bẫy
Channel không đệm là trao tận tay, channel có đệm là tủ khoá có N ngăn. Quy tắc ai được đóng channel, bốn thao tác gây panic, và vì sao đệm vô hạn chỉ giấu vấn đề chứ không sửa.
15/07/2026
· 7 phút đọc
33
select chọn nhánh sẵn sàng một cách ngẫu nhiên — và một channel đã đóng có thể đẩy CPU lên 100%
select như ngồi trông nhiều cần câu: giật cái nào rung trước, hai cái rung cùng lúc thì bốc thăm. default để không phải ngồi chờ, mẫu hết giờ, và mẹo gán channel về nil để cất một cần đi.
16/07/2026
· 6 phút đọc
34
Đếm 100000 lần chỉ ra 79279, và RWMutex chậm hơn Mutex: khi nào khoá là câu trả lời đúng
Một biến dùng chung như tấm bảng đếm treo tường mà cả nhóm cùng ghi: muốn cộng một thì đọc số cũ, cộng trong đầu, ghi lại — hai người làm cùng lúc là mất một. Mutex là cây phấn duy nhất, atomic là cái đếm cơ khí, và vì sao RWMutex không phải nâng cấp miễn phí.
17/07/2026
· 7 phút đọc
35
Gọi Add() bên trong goroutine là Wait() trả về ngay — ba công cụ sync và cái bẫy của mỗi cái
sync như bộ công cụ của một trưởng đoàn: WaitGroup là điểm danh (đủ người mới đi), Once là cái cổng người đầu mở cho cả nhóm, Pool là giá đồ thuê phải lau sạch trước khi dùng lại. Ba công cụ, ba cái bẫy thật.
18/07/2026
· 6 phút đọc
36
Race detector không bao giờ báo nhầm — nhưng nó chỉ thấy lỗi đua trên đường mã thật sự chạy
Race detector như một giám sát đứng xem ca làm thật với camera tua lại được, không phải đọc sơ đồ xưởng: nó bắt đúng khoảnh khắc hai goroutine chạm cùng ô nhớ mà không ai ra hiệu, kèm số dòng của cả đọc lẫn ghi. Chi phí thật, cái nó KHÔNG bắt, và cách đưa vào CI.
19/07/2026
· 6 phút đọc
37
Pipeline, fan-out, fan-in: ba mẫu đồng thời chỉ cần goroutine + channel — và cái dây dừng khẩn ai cũng quên
Pipeline như dây chuyền lắp ráp với băng chuyền nối các trạm; fan-out là nhiều thợ cùng bốc từ một băng chuyền; fan-in là nhiều băng gộp một. Thiếu dây dừng khẩn (context), cả dây chuyền kẹt mãi khi đầu cuối ngừng nhận.
20/07/2026
· 7 phút đọc
38
Bộ thu gom rác không cứu được goroutine rò rỉ — và một ký tự đệm là đủ để chặn nó
Goroutine rò rỉ như người giao hàng bạn phái đi rồi kẹt mãi ở quầy không ai nhận: đội dọn dẹp (GC) không bao giờ đuổi một người đang 'làm việc' về. Bốn nguyên nhân, đo bằng NumGoroutine và pprof, goleak trong test, và bốn quy tắc phòng.
21/07/2026
· 6 phút đọc
39
Hàm trả về khi hết giờ, nhưng goroutine bên trong kẹt mãi — và cách sửa bằng đúng một ký tự
Hết giờ bạn bỏ về, người giao hàng làm xong vẫn đứng ở cửa ôm gói không ai nhận. Lan truyền huỷ qua nhiều tầng goroutine, mẫu kết quả có đệm, và ba chỗ context buộc phải xuất hiện.
22/07/2026
· 6 phút đọc
40
'Chỉ đọc thôi chắc không sao' — câu sai nguy hiểm nhất về đồng thời, đo bằng atomic và mô hình bộ nhớ Go
atomic như cú bật công tắc đèn — không bao giờ có trạng thái nửa vời để ai thấy. Ba con số cho atomic/Mutex/channel, CompareAndSwap, atomic.Pointer, và vì sao 'đua dữ liệu' không phải đọc-ra-giá-trị-cũ mà là không-xác-định.
23/07/2026
· 7 phút đọc
41
errgroup: khi một goroutine hỏng, cả nhóm dừng theo — thứ WaitGroup không làm được
WaitGroup như đội leo núi mạnh ai nấy leo, tới đỉnh mới biết ai kẹt; errgroup buộc cả đội chung một dây có bộ đàm. SetLimit giới hạn đồng thời, và điều errgroup KHÔNG làm.
24/07/2026
· 6 phút đọc
42
'Luôn dùng channel' là hiểu sai châm ngôn nổi tiếng nhất của Go — và số đo cho thấy vì sao
Hỏi 'channel hay mutex nhanh hơn' giống hỏi 'email nhanh hơn hay họp phòng nhanh hơn' — vô nghĩa nếu không biết đang phối hợp việc gì. Đo channel, Mutex và atomic trên cùng khối lượng, và bộ tiêu chí chọn theo cấu trúc bài toán.
25/07/2026
· 8 phút đọc
43
Cùng một vòng ghi, bufio nhanh gấp 58 lần — và một dòng Flush() quên là mất sạch dữ liệu
io.Reader và io.Writer là một đầu nối chuẩn mà mọi nguồn cắm vào mọi đích; mỗi lời gọi hệ thống như một lần qua cửa soát vé tốn tiền, bufio chất đầy xe rồi qua một lần. Scanner và giới hạn 64KB của nó.
26/07/2026
· 6 phút đọc
44
os.ReadFile nạp cả tệp 2GB vào RAM — và mẹo ghi tệp an toàn bằng đổi tên nguyên tử
Làm việc với tệp như làm việc trong phòng lưu trữ hồ sơ: ReadFile là ôm cả tập tài liệu ra một lúc, đọc theo luồng là đọc từng trang tại bàn. Ghi an toàn bằng tệp tạm rồi đổi tên, đường dẫn khả chuyển, và io/fs cho test.
27/07/2026
· 6 phút đọc
45
Bốn cách encoding/json âm thầm làm sai ý bạn — và không báo một tiếng nào
JSON là tờ khai tự do, struct là tờ có ô định sẵn kiểu, và người chép lịch sự tới mức nguy hiểm: vứt trường lạ, cắt số quá to, nhầm trống với số 0, không thấy trường viết thường — tất cả trong im lặng.
28/07/2026
· 7 phút đọc
46
net/http dựng server sản xuất trong mười dòng — nhưng mặc định không có timeout nào, và đó là cửa DoS rẻ tiền
Server như quầy tiếp tân cử một nhân viên riêng cho mỗi khách; khách bước tới rồi im lặng mãi thì giữ nhân viên đó mãi. ServeMux của Go 1.22, mỗi request một goroutine, và bốn timeout bắt buộc phải đặt.
29/07/2026
· 7 phút đọc
47
http.DefaultClient chờ vĩnh viễn, và không đọc hết body thì mỗi request chậm gấp ba
Gọi API như cú điện thoại trên đường dây tốn công thiết lập: Go giữ sẵn một bể đường dây và dùng lại, nhưng chỉ khi bạn để đầu kia nói hết rồi gác máy đàng hoàng. Timeout mặc định bằng 0, đọc hết body, lỗi HTTP không phải lỗi Go, và cấu hình Transport.
30/07/2026
· 6 phút đọc
48
Middleware trong Go là bảy dòng, không framework — nó chỉ là hàm nhận Handler trả Handler
Middleware như búp bê Nga lồng nhau: mỗi lớp bọc lấy lớp trong, request mở từ ngoài vào tới lõi rồi đóng ngược ra. Cách xâu chuỗi, bắt mã trạng thái để log, và khi nào cần router bên ngoài.
31/07/2026
· 6 phút đọc
49
sql.Open không hề mở kết nối, và pool mặc định không giới hạn — hai bất ngờ và một rò rỉ ba dòng
sql.DB là cái tủ chìa khoá của đội xe dùng chung, không phải một chiếc xe. sql.Open không kết nối, pool mặc định phát chìa vô hạn, NULL không quét vào string, và rò rỉ kết nối tái hiện bằng ba dòng.
01/08/2026
· 8 phút đọc
50
Trong Go 'cộng một ngày' khác 'cộng 24 giờ', và so sánh Time bằng == thì sai
Giữ thời gian là hai cái đồng hồ khác nhau: đồng hồ treo tường + lịch (có múi giờ, chỉnh được, một ngày có khi 23 giờ) và đồng hồ bấm giây (chỉ tăng, đo khoảng). Layout 2006-01-02, so sánh bằng Equal, AddDate khác Add, và ba cái bẫy Timer.
02/08/2026
· 7 phút đọc
51
Go cố tình không có assertEquals, và test bằng một cái bảng — cộng fuzzing 4,8 triệu lần trong 5 giây
Test kiểu bảng như chấm bài bằng một đáp án và một danh sách: một quy trình chấm, mỗi dòng một ca, thêm ca là thêm dòng. Subtest, t.Parallel, độ phủ, fuzzing Go tự sinh đầu vào, và vì sao Go bỏ thư viện assertion.
03/08/2026
· 7 phút đọc
52
pprof chỉ thẳng hàm cấp phát 16,55 GB — và vì sao 'đo trước khi tối ưu' là luật, không phải lời khuyên
Như gắn đồng hồ đo vào từng ổ cắm thay vì đoán thiết bị nào ngốn điện. Viết benchmark chuẩn, đọc cột allocs/op, và để pprof chỉ thẳng ra hàm tạo rác thật — thay vì tối ưu nhầm chỗ cả tuần.
04/08/2026
· 7 phút đọc
53
replace, vendor, workspace: công cụ Go module khi dự án hết nhỏ — và cái bẫy replace chỉ bind module chính
Dự án như một nhà thầu chính ghép nhiều thầu phụ: replace là dùng crew riêng cho một việc, nhưng chỉ bind công trình của bạn; vendor là giữ bản sao mọi bản vẽ tại chỗ; workspace là bản kế hoạch chung cho hai công trình. Nâng cấp an toàn và MVS.
05/08/2026
· 7 phút đọc
54
Một máy build ra binary cho năm hệ điều hành — và vì sao CGO_ENABLED=0 mới là dòng quan trọng nhất
Binary Go như bộ đồ phi hành gia mang sẵn bình oxy: thả xuống đâu cũng sống, không cần hệ thống có libc hay JRE. GOOS/GOARCH, ldflags nhúng phiên bản, build tĩnh, và build tag tách mã theo môi trường.
06/08/2026
· 7 phút đọc
55
Ảnh Docker Go: 1,34 GB hay 11,7 MB? Đừng gửi cả căn bếp chỉ để giao một cái bánh
Ảnh golang đầy đủ là đóng cả lò nướng và bột sống vào thùng chỉ để giao một chiếc bánh. Ba cách đóng gói đo bằng số, vì sao scratch chạy được, và bốn thứ phải tự bỏ vào cái hộp rỗng.
07/08/2026
· 7 phút đọc
56
Go không có framework cấu hình — và vì sao 'đọc một lần vào một struct' tốt hơn mọi thư viện
Cấu hình như quầy lễ tân: đọc hết giấy tờ một lần lúc vào, đóng dấu, rồi phát một tấm thẻ mang theo khắp nơi — thay vì mỗi phòng lại bắt trình lại. Cờ, biến môi trường hay tệp, thứ tự ưu tiên, và cách gom thành một struct kiểm tra được.
08/08/2026
· 6 phút đọc
57
slog biến log thành dữ liệu truy vấn được — nhưng đối số Debug vẫn bị tính dù bạn đã tắt nó
log cũ như cuốn nhật ký văn xuôi phải grep bằng regex; slog như cuốn sổ cái có cột, mỗi sự kiện một trường truy vấn được. Hai handler, With gắn ngữ cảnh, che dữ liệu nhạy cảm, và cái bẫy đối số tính dù mức log đã tắt.
09/08/2026
· 6 phút đọc
58
srv.Close() làm vài chục người nhận lỗi mỗi lần deploy; Shutdown() thì không ai hay — và Docker chỉ cho bạn 10 giây
Tắt dịch vụ như đóng cửa hàng cuối ngày: Close() là cúp cầu dao đuổi khách đang thanh toán; Shutdown() là khóa cửa với khách mới rồi để khách trong tính tiền nốt. Thứ tự đóng, hạn chờ, và cái bẫy endpoint trong Kubernetes.
10/08/2026
· 6 phút đọc
59
36 lỗ hổng, hay chỉ 0 cái đáng lo? Vì sao govulncheck đếm khác mọi máy quét khác
govulncheck không đếm lỗ hổng có trong nhà — nó đi từ cửa chính theo mọi hành lang và chỉ báo cái nằm trên đường mã bạn thật sự gọi tới. Cộng năm chỗ khác phải tự kiểm, và ba họ lỗi Go xoá sẵn cho bạn.
11/08/2026
· 7 phút đọc
60
Xe máy hay xe tải: 60 ngày Go, và vì sao 'ngôn ngữ nào tốt hơn' là câu hỏi sai
Nhìn lại sáu chặng, mười phép đo đáng nhớ nhất, đặt cạnh sê-ri Java trên cùng một máy, và bản đồ đi tiếp. Go và Java là một sự đánh đổi, không phải một thứ bậc.
12/08/2026
· 8 phút đọc