L30 — Generics: type parameters, constraints, performance

Ba module tương tác để "chạm" vào generics Go: (1) xem cách compiler suy ra T từ đối số, (2) test xem type nào thoả constraint nào, và (3) so sánh performance Sum 1M phần tử giữa raw, generic, và interface{}. Tất cả standalone, mở file:// là chạy.

1. Type parameter inference — Go suy ra T từ đối số

Cho function signature func Min[T Ordered](a, b T) T. Khi bạn gọi Min(3, 5), compiler không cần bạn ghi Min[int](3, 5) — nó suy ra T = int từ kiểu của 35. Nhập 2 giá trị bên dưới, bấm Instantiate để xem T được resolve.

Generic signature

func Min[T Ordered](a, b T) T { if a < b { return a } return b }

Instantiated function

// Bấm Instantiate để xem T được resolve

Inference trace

// Steps compiler thực hiện sẽ hiện ở đây

2. Constraint satisfaction — type nào thoả constraint nào?

Chọn 1 constraint bên trái. Các type bên phải sẽ highlight: xanh ✓ = thoả, mờ ✗ = không thoả. Đây là cách trực quan nhất để nhớ "constraint nào cho phép type nào".

Chọn 1 constraint để xem giải thích.

3. Performance — Generic vs interface{} vs raw int

Chạy benchmark thực tế trong trình duyệt: tính Sum trên 1,000,000 phần tử với 3 cách. Generic gần như miễn phí so với raw; interface{} chậm hơn nhiều do boxing + type assertion.

Raw int (loop)
Generic [T]
interface{}
Raw — monomorphic, baseline Generic — type param, ~ngang raw interface{} — boxing + assertion, chậm
Đây là mô phỏng trên JavaScript (V8) để bạn hình dung — JS không phân biệt sharp như Go runtime, nhưng cấu trúc chậm/nhanh khá tương đương. Trên Go thật, interface{} thường chậm 5-15× so với raw vì mỗi int được box lên heap.