เรื่อง 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 มา น่าสนใจนะครับ