L31 — reflect: runtime introspection

Reflect cho phép chương trình tự nhìn vào chính nó tại runtime: đọc type, đọc field, đổi giá trị, gọi hàm theo tên. Bài này có 3 module: (1) inspect struct và tag, (2) trắc nghiệm khi nào value CanSet(), (3) so sánh chi phí direct vs reflect.

1. Struct Inspector — walk fields + tag

Dán định nghĩa struct vào ô bên dưới (syntax Go). Inspector sẽ parse rồi hiển thị bảng Name / Type / Kind / Tag, mô phỏng đúng những gì reflect.TypeOf(x).Field(i) trả về.

2. Settable check — khi nào CanSet() == true?

Một reflect.Value có settable hay không quyết định việc bạn có gọi SetX được mà không panic. Click Check ở từng case để xem kết quả + lý do.

3. Performance — direct call vs reflect call (1M ops)

Bar chart dưới đây mô phỏng thời gian thực thi 1 triệu thao tác, dựa trên benchmark thực của Go 1.22 trên máy modern (Apple M1). Reflect chậm hơn direct 10-100× tuỳ thao tác.

⚠ Lưu ý hot path: Nếu hàm chạy 1M lần/giây (vd HTTP handler), reflect có thể đẩy latency từ ms lên hàng chục ms. Pattern chuẩn: cache reflect.Type info ngoài vòng lặp, hoặc dùng code generation (như easyjson, protobuf) thay vì reflect runtime.