[Go] any type argument satisfies comparable constraint in Go 1.20
ขอสรุปเรื่องของภาษาที่เปลี่ยนไปใน Go 1.20 เกี่ยวกับกระบวนการ satifying a type constraint ของ type any
เอาไว้หน่อย
ขอสรุปเรื่องของภาษาที่เปลี่ยนไปใน Go 1.20 เกี่ยวกับกระบวนการ satifying a type constraint ของ type any
เอาไว้หน่อย
เรามี method ที่รับค่าเป็น type any
ซึ่งจะส่งอะไรให้ก็ได้แต่จริงๆเราอยากจำกัดให้ส่งได้แค่บาง type วันนี้จะลองใช้ generic type ช่วยสร้าง type ใหม่ครอบการทำงานของ method นี้ทำให้คนใช้งานเห็นชัดเจนว่าใช้กับ type ไหนได้บ้าง แถม compiler ช่วยเช็คให้ตั้งแต่ตอน compile และ IDE/Editor ช่วย autocomplete ขึ้นมาให้อีกด้วย
บางการทำงานเช่นโหลดข้อมูลจากไฟล์หลายๆ record แล้วเขียนลง database เราไม่จำเป็นต้องให้มันทำงานทีละ 1 record เสร็จก่อนแล้วค่อยไปทำเขียน record ถัดไปก็ได้ เราสามารถแยกการทำงานให้ทำในหลายๆ goroutine แล้วใช้ความสามารถของเครื่อง (CPU) ให้เต็มที่ถ้ามีหลายๆ CPU หลายๆ core ซึ่ง package errgroup ช่วยเราทำแบบนี้ได้พร้อมจัดการ error และ cancel context ได้อีกด้วย
อาทิตย์ที่ผ่านมาเจอกรณีว่าเขียนเทสที่ต่อกับ Firestore ซึ่งก็ใช้ Firestore Emulator แทนที่จะต่อไปที่ Firestore จริงๆ แต่กลับพบว่า Firestore Emulator เก็บ timestamp แค่ถึงหลัก microsecond แต่โค้ด Go เราส่งไปเก็บถึงหลัก nanosecond เลยทำให้ข้อมูล query กลับมาไม่เท่ากันกับที่ใส่เข้าไป
โค้ดที่เราใช้ time.Now()
ใน package ทำให้โค้ดเราไม่สามารถเขียนเทสแล้วเช็คได้ว่า ค่าที่ได้ตอนเทสคือะไร ทางเลือกนึงง่ายๆที่ใช้อยู่ตอนนี้เพื่อให้ทดสอบโค้ดที่ใช้ time.Now()
ได้คือใช้ตัวแปรเก็บฟังก์ชัน time.Now เอาไว้ซะ เราจะได้เปลี่ยนได้ตอนเขียนเทส
ไม่ใช่ทุก type จะมี literal value ที่ใช้ operator &
เพื่อเอา pointer ออกมาได้
มีแค่ struct, map, array, slice ที่มี literal value แล้วใช้ &
เพื่อเอา pointer ออกมาได้ทันที
ทีนี้ถ้าเป็นค่าอื่นๆเช่น string, int, bool หรือค่าที่เรียกจากฟังก์ชันเช่น time.Date, time.Now เราจะใช้ &
ไม่ได้เช่น
Go generic type ที่มีมาตั้งแต่ Go version 1.18 นั้นช่วยให้เราลดโค้ดที่ซ้ำซ้อนกรณีที่ logic ของ function เหมือนกันหมด ต่างกันแค่ type ของ parameter ลงไปได้ แต่ถ้า code ของ function เรารับค่าเป็น struct ใช้งาน field เหมือนกันหมด ต่างกันแค่คนละ type เรายังไม่สามารถใช้ generic ช่วย refactor code ออกมาเป็น function เดียวได้ง่ายๆ ตัวอย่างเช่น
Framework ของเราไม่เท่ากัน เวลาคนที่คุ้นเคยกับ web framework ของ stack ที่ตัวเองใช้อยู่ แล้วมาหัดใช้ Go ก็มักจะถามหา Framework ว่า Go นิยมใช้ตัวไหนกันบ้าง แต่สุดท้ายก็มักจะไม่เจอ framework แบบที่เคยใช้ หรือแบบที่คิดไว้ ก็ผิดหวัง หรือรู้สึกใช้งานยากกันไป
Rancher Desktop เป็นโปรแกรมที่ช่วยจัดการสร้าง Kubernetes cluster บนเครื่อง Desktop (local machine) ให้เรา พร้อมลงเครื่องมาต่างๆให้เราเสร็จสรรพ หรือถ้าใครจะลง Rancher Desktop แล้วใช่แค่ Docker ไม่ใช่ Kubernetes ก็ยังได้ เราสามารถลง Rancher Desktop แทนการลง Docker Desktop ได้เลย
โพสต์นี้สั้นๆ อยากจะโน้ตเอาไว้หน่อยว่า max_expansions
option ของ Elasticsearch query นั้นมัน apply ที่ shard level