Tiêu chí do chính đội ngũ Go đưa ra: dùng type parameter khi code giống hệt nhau ở nhiều kiểu; đừng dùng khi các cài đặt thực sự khác nhau — lúc đó interface (hoặc code riêng) rõ ràng hơn.
Nên dùng khi:
- Hàm thao tác trên slice / map / channel của kiểu bất kỳ mà thân hàm không quan tâm kiểu phần tử (slices.Contains, maps.Keys).
- Cấu trúc dữ liệu đa mục đích: cây, set, hàng đợi.
- Method giống nhau chỉ khác kiểu, đang phải copy-paste SumInts / SumFloats.
Không nên dùng khi:
- Chỉ có một kiểu đang dùng thật. Viết cụ thể trước, tổng quát hóa khi có người dùng thứ hai.
- Hành vi thay đổi theo kiểu — ví dụ mỗi kiểu đọc dữ liệu một cách khác nhau. Đó là chỗ của interface method, vì mỗi kiểu tự cài phần khác biệt.
- Chỉ để tránh viết interface{} một chỗ, hoặc để "trông hiện đại". Type parameter làm chữ ký hàm khó đọc và khó suy luận hơn.
Chi phí kỹ thuật cần biết: Go cài generics theo hướng GC shape stenciling — các kiểu con trỏ dùng chung một bản sinh mã và gọi method qua bảng ẩn (dictionary), nên generic code không tự động nhanh hơn bản dùng interface, đôi khi còn chậm hơn một chút. Nếu lý do duy nhất để dùng generics là hiệu năng, hãy đo benchmark trước.