จากการมาเรียน Workshop Practical Go
ในงาน GopherCon 2019 ที่ประเทศสิงคโปร์ มีหลายเรื่องที่น่าสนใจ ประกอบไปด้วย

  • Idiomatic code
  • Package และ project structure
  • API design
  • Error handling
  • Testing นิดหน่อย

ส่วนเรื่อง concurrency นั้นไม่ได้สอนเพราะว่า เวลาหมดก่อน
เรื่องที่ผมให้ความสนใจเรื่องแรกคือ Error handling
เนื่องจากใน Go 2 นั้น มีการพูดถึงปัญหาและแนวทางการปรับปรุงเรื่องนี้ให้ดีและง่ายขึ้น

สิ่งที่น่าสนใจของการจัดการ Error ที่ดีนั้น

  • ต้องไม่ทำให้ logic หรือการทำงานของ code มันยุ่งยากหรือวุ่นวาย เพราะว่าทำให้เข้าใจได้ยาก
  • Software ที่ดีและน่าเชื่อถือ ไม่จำเป็นต้องมาจัดการ unchecked หรือ runtime exception เอง

ปล.
นี่คือการด่าภาษา Java เลยนะ  ที่มี try/catch block
รวมถึงต้องจัดการ runtime exception เองอีก !!

แต่สิ่งที่น่าสนใจกว่าคือ

จะดีกว่าไหม ?
ถ้าเราไม่จำเป็นต้องจัดการ error หรือทำการลด code
ที่ต้องทำการตรวจสอบ error ลง
เพราะว่าส่วนของการจัดการหรือตรวจสอบ error นั้น
ส่งผลต่อขั้นตอนการทำงานใน function นั้น ๆ
แน่นอนว่าทำให้ซับซ้อนและเข้าใจยากขึ้น !!

มาดูตัวอย่างการนับจำนวนบรรทัดของข้อมูลกัน

คำอธิบาย
จาก code ที่เขียนขึ้นมานั้น
จะต้องทำการวน loop เพื่ออ่านข้อมูลของแต่ละบรรทัด
ด้วย function ReadString() จาก bufio.Reader
อ่านไปจนกว่าจะจบไฟล์นั้น ๆ
โดยในแต่ละรอบต้องทำการตรวจสอบ error ด้วยเสมอ
คำถามคือ สิ่งที่เขียนมานั้น มันใช่สิ่งที่เราต้องการจริง ๆ หรือไม่ ?

จะดีกว่าไหม ถ้าเปลี่ยนวิธีคิดและวิธีเขียนกัน

เป้าหมายเพื่อลดการจัดการ error ลงมา หนึ่งในนั้นคือ
การใช้ bufio.Scaner แทน 
โดยที่จะเป็น abstraction layer หรือ helper ที่ครอบ bufio.Reader ไว้
ช่วยจัดการ error ต่าง ๆ ให้
ดังนั้นในมุมมองของคนใช้งานอย่างเรา ๆ ท่าน ๆ 
ไม่จำเป็นต้องมาจัดการ error ต่าง ๆ เองหรือลดการตรวจสอบลงไป
ดังตัวอย่าง

คำอธิบาย
จาก code นั้น scanner จะมี function Scan() ให้ใช้งาน
ทำการ return ค่า true ถ้าอ่านเจอข้อมูลในบรรทัดและไม่มี error เกิดขึ้น
แต่ถ้ามี error ขึ้นมา จะ return ค่า false
ที่สำคัญจะทำการบันทึก error ที่เกิดขึ้นให้
สามารถเรียกใช้ function Err() จาก scanner อีกด้วย
ทำให้ code ดูอ่านง่าย เข้าใจง่าย
ที่สำคัญคือ มี code เท่าที่เราต้องการอีกด้วย

เป็นอีกแนวทางหนึ่งที่น่าสนใจ
ที่ต้องศึกษา ฝึก ลงมือทำและปรับปรุงต่อไป