เรื่อง Generic ในภาษา Go น่าจะเป็นอีกหนึ่งเรื่องที่พูดถึงกกันมาก ๆ
โดย draft version ใหม่จะเอาแนวคิดของ contract ออกไป
จะเหลือเพียง type parameters
เนื่องจากทำให้เกิดความสับสนใจการใช้งาน
ถ้าใครต้องการทดลองใช้ความสามารถนี้ ทำได้ 2 วิธีคือ
- ทำการ build go จาก source เอง จาก tag ล่าสุด จะมี tool ชื่อว่า go2go ให้ใช้
- ใช้งานผ่าน Go2Go playground
หลังจากที่อ่าน specification ไปคร่าว ๆ
พบว่ามีเรื่องที่เข้าใจและสนใจดังนี้
1. เรื่องของ Generic คืออะไร ?
คือ function หรือ type ที่สามารถกำหนด type parameter ได้ จากเดิมที่เรามักจะประกาศ parameter ใน function เป็น type interface !! ทำให้การอ่าน code เข้าใจยาก รวมทั้งอาจจะต้องทำการตรวจสอบด้วยว่า สิ่งที่ส่งมานั้นมี type ตามที่เราต้องการ ก่อนนำมาใช้งานหรือไม่ ดังนั้น ถ้าทำการปรับปรุงตัวภาษา น่าช่วยทำให้ดีขึ้น
วิธีการอื่น ๆ ที่นำมาใช้ก่อนมี Generic ในภาษา Go เช่น
- Copy and paste code มาใช้งาน
- ใช้งาน interface ใน function
- ใช้ type assertion ทำงานร่วมกับ empty interface
- ใช้ reflection
- ใช้เครื่องมือพวก code generator
2. ลองใช้งานด้วยการเขียน code กันหน่อย ด้วย Generic ใน Go2Go playground
ในการอออกแบบจะมีส่วนต่าง ๆ ดังนี้
- Type parameters
- Multiple type paarameters
- Constraint
- Generic types
เยอะไปหมดเลย ลองอ่านเพิ่มเติมจาก link ของ specification ข้างต้นได้
มีโจทย์ง่าย ๆ เช่นการเพิ่มข้อมูลผลไม้เข้าไปยังตระกร้าสินค้า
สามารถเขียนแบบปกติได้ประมาณนี้
เมื่อมาเขียนด้วย Generic ต้องทำการกำหนด type ของ Basket ก่อนว่าเป็นอย่างไร
และของในตะกร้าคือผลไม้นะ
และเพิ่มความสามารถให้ Basket สามารถเพิ่มและเอาผลไม้ออกมาจากตะกร้าได้
เมื่อใช้งานก็กำหนดไปว่า ผลไม้ที่อยู่ในตะกร้ามีชนิดเป็นอะไร
จากนั้นก็ใช้งานได้เลย
แน่นอนว่า เราไม่สามารถเพิ่มผลไม้ที่ต่างชนิดที่ประกาศไว้ได้
ยังสามารถประยุกต์ได้อีกเยอะ
แต่ก็ถือว่า เป็นอีกความสามารถหนึ่งที่เรียนรู้กันไว้ครับ
ไปเจอรูปนี้ใน Reddit มา น่าสนใจนะครับ