Golang วิธีเขียน Optionals Config

ในภาษา Go จะมี syntax อยู่แบบนึงเรียกว่า Variadic Functions เป็นรูปแบบการประกาศ params ของฟังก์ชันโดยที่ว่าจะส่งตัวแปรเข้ามากี่ตัวก็ได้แต่มีเงื่อนไขคือต้องเป็นตัวแปรประเภทเดียวกันเท่านั้นแบบนี้

func sumN(n ...int) int {
var sum int
for _, i := range n {
sum += i
}
return sum
}
sumN(10) // 10
sumN(1, 2, 3) // 6
sumN(1, 2, 3, 4, 5) // 15

จากตัวอย่างฟังก์ชัน sumN จะรับตัวแปรเป็น int โดยสามารถส่งตัวแปรเข้าไปกี่ตัวก็ได้ตั้งแต่ 0 จนถึง n​​ ด้วยหลักการนี้เราสามารถใช้ได้กับตัวแปรทุกประเภทไม่เว้นแม้แต่ interface, struct หรือ func

ลองนำมาประยุกต์ใช้งานกับการสร้าง object จาก struct ที่ต้องการ สมมติว่ามี struct สำหรับเก็บประเภทของรถยนต์โดยเมื่อสร้าง object ใหม่ผู้ใช้งานสามารถปรับแต่งค่าของ properties ข้างในได้ เช่นเปลี่ยนขนาดของล้อ, ประเภทเครื่องยนต์,​ สีรถยนต์ และอื่น ๆ

ก่อนอื่นลองสร้าง struct ของรถยนต์นี้กันก่อน

จากนั้นสร้างฟังก์ชันสำหรับสร้างรถยนต์โดยให้สามารถเลือก custom ได้ว่าจะปรับแต่งส่วนไหนได้บ้างแบบนี้

จากตัวอย่างข้างบนหลักการก็ง่าย ๆ คือสร้างตัวแปร CarOptionFunc ซึ่งเป็นตัวแปรประเภท func ที่รับ params เป็น *Car และ returns error ซึ่งแต่ละฟังก์ชันที่ใช้สำหรับ set ค่า config ก็จะทำการ returns กลับไปเป็นฟังก์ชันนี้

ซึ่งฟังก์ชัน NewCustomCar() ก็เป็น Variadic Functions ที่รับตัวแปรประเภท CarOptionFunc เป็นจำนวนเท่าไรก็ได้ดังนั้นถ้าเรียกใช้ฟังก์ชัน NewCustomCar() แบบไม่ส่งค่าอะไรมาเลยก็จะได้ object ของ struct Car ที่มี properties เป็น default ทุกค่า

และถ้าต้องการ set บางค่าของ object ตอนสร้างก็สามารถทำได้แบบนี้

aPinkCar := NewCustomCar(
SetColor("pink"),
) // For create a pink car
aRedCarWithBigWheel := NewCustomCar(
SetColor("red"),
SetWheelSize(21.9),
) // For create a red car and wheel size 21.9"

ก็เป็นอีกวิธีสำหรับการสร้าง object ที่ต้องการ custom บาง properties ช่วยให้ code ดูสวยและอ่านง่ายขึ้นครับ