กระจายการทำงานหลายๆ งาน ผ่านหลายๆ goroutine ง่ายๆ ด้วย package errgroup

บางการทำงานเช่นโหลดข้อมูลจากไฟล์หลายๆ record แล้วเขียนลง database เราไม่จำเป็นต้องให้มันทำงานทีละ 1 record เสร็จก่อนแล้วค่อยไปทำเขียน record ถัดไปก็ได้ เราสามารถแยกการทำงานให้ทำในหลายๆ goroutine แล้วใช้ความสามารถของเครื่อง (CPU) ให้เต็มที่ถ้ามีหลายๆ CPU หลายๆ core ซึ่ง package errgroup ช่วยเราทำแบบนี้ได้พร้อมจัดการ error และ cancel context ได้อีกด้วย

Read full post gblog_arrow_right

Go Time Truncate

อาทิตย์ที่ผ่านมาเจอกรณีว่าเขียนเทสที่ต่อกับ Firestore ซึ่งก็ใช้ Firestore Emulator แทนที่จะต่อไปที่ Firestore จริงๆ แต่กลับพบว่า Firestore Emulator เก็บ timestamp แค่ถึงหลัก microsecond แต่โค้ด Go เราส่งไปเก็บถึงหลัก nanosecond เลยทำให้ข้อมูล query กลับมาไม่เท่ากันกับที่ใส่เข้าไป

Read full post gblog_arrow_right

วิธีเทสโค้ดที่ใช้ Time.Now

โค้ดที่เราใช้ time.Now() ใน package ทำให้โค้ดเราไม่สามารถเขียนเทสแล้วเช็คได้ว่า ค่าที่ได้ตอนเทสคือะไร ทางเลือกนึงง่ายๆที่ใช้อยู่ตอนนี้เพื่อให้ทดสอบโค้ดที่ใช้ time.Now() ได้คือใช้ตัวแปรเก็บฟังก์ชัน time.Now เอาไว้ซะ เราจะได้เปลี่ยนได้ตอนเขียนเทส

Read full post gblog_arrow_right

Pointer of any type T

ไม่ใช่ทุก type จะมี literal value ที่ใช้ operator & เพื่อเอา pointer ออกมาได้

มีแค่ struct, map, array, slice ที่มี literal value แล้วใช้ & เพื่อเอา pointer ออกมาได้ทันที

ทีนี้ถ้าเป็นค่าอื่นๆเช่น string, int, bool หรือค่าที่เรียกจากฟังก์ชันเช่น time.Date, time.Now เราจะใช้ & ไม่ได้เช่น

Read full post gblog_arrow_right

Go generic with struct field name

Go generic type ที่มีมาตั้งแต่ Go version 1.18 นั้นช่วยให้เราลดโค้ดที่ซ้ำซ้อนกรณีที่ logic ของ function เหมือนกันหมด ต่างกันแค่ type ของ parameter ลงไปได้ แต่ถ้า code ของ function เรารับค่าเป็น struct ใช้งาน field เหมือนกันหมด ต่างกันแค่คนละ type เรายังไม่สามารถใช้ generic ช่วย refactor code ออกมาเป็น function เดียวได้ง่ายๆ ตัวอย่างเช่น

Read full post gblog_arrow_right

Go Frameworks

Framework ของเราไม่เท่ากัน เวลาคนที่คุ้นเคยกับ web framework ของ stack ที่ตัวเองใช้อยู่ แล้วมาหัดใช้ Go ก็มักจะถามหา Framework ว่า Go นิยมใช้ตัวไหนกันบ้าง แต่สุดท้ายก็มักจะไม่เจอ framework แบบที่เคยใช้ หรือแบบที่คิดไว้ ก็ผิดหวัง หรือรู้สึกใช้งานยากกันไป

Read full post gblog_arrow_right

ลองใช้ Rancher Desktop

Rancher Desktop เป็นโปรแกรมที่ช่วยจัดการสร้าง Kubernetes cluster บนเครื่อง Desktop (local machine) ให้เรา พร้อมลงเครื่องมาต่างๆให้เราเสร็จสรรพ หรือถ้าใครจะลง Rancher Desktop แล้วใช่แค่ Docker ไม่ใช่ Kubernetes ก็ยังได้ เราสามารถลง Rancher Desktop แทนการลง Docker Desktop ได้เลย

Read full post gblog_arrow_right