Lo library (Lodash version Golang) ทดลองทำความเข้าใจ และเริ่มลองใช้งาน

Sharing is caring!

Lodash ชื่อนี้ไม่ใช่ชื่อใหม่อะไร นักพัฒนาสาย Javascript จะพอคุ้น ๆ หรือได้ยินผ่านหูมาบ้าง ถ้าผู้อ่านท่านใดยังไม่เคยได้ยินมาก่อน ผมอยากจะขออธิบายเรื่อง Lodash สั้น ๆ แต่ถ้าหากใครอยากที่จะทราบข้อมูลรายละเอียดลึก ๆ ก็สามารถเข้าไป อ่านและทดสอบใช้งานได้จากที่นี่ Lodash

Lodash (javascript version) และ Lo (golang version) มันคืออะไร

ผมขอธิบายรวม ๆ กันเลย เพราะหลักการประโยชน์มันจะเหมือนกัน นั้นคือ Lodash,Lo เป็น Library, package (golang จะเรียก package) เป็นเครื่องมือ หรือชุดคำสั่งสำหรับใช้ในการจัดการกับพวก collection type ต่าง ๆ เช่น Array, List, Map, Slice (golang จะมี slice คล้ายกับ List แต่แค่ไม่ fixed size ของ collection), อื่น ๆ ที่จะถูกสร้างมาให้ใช้ในรูปแบบ function ที่สะดวกสบาย โค๊ดสั้นลง ดูทำให้โค๊ดดูเป็นระเบียบ ยกตัวอย่าง function ที่มีให้เรียกใช้งาน

  • map: [1,2,3,4,5] -> [‘a’,’b’,’c’,’d’,’e’] // แทนด้วยตัวอักษะตามลำดับ
  • filter: [1,2,3,4,5] -> [2,4] // ถูกกรองออกด้วยตัวเลขคี่ 1,3,5
  • reduce [1,2,3,4,5] -> 15 // ผลรวมของเลขทั้งหมด ( จริงมี sum ให้เรียกใช้ reduce จะใช้กับ array type อื่น ๆ ได้มากกว่า)
  • flatten [1,2,3,4,5],[6,7] -> [1,2,3,4,5,6,7] // ทำการรวม 2 array เข้าด้วยกัน
  • อื่น ๆ อีกเพียบ

อย่างไรก็ตามทั้ง 2 ภาษาจะมี function ทำหน้าที่คล้ายกัน แต่จะแตกต่างตามโครงสร้างของภาษา และบทความนี้ก็จะพามาทำความรู้จัก Lo กันให้มากขึ้น

การติดตั้ง Lo

เมื่อเรามี project เดิมที่ต้องการจะเรียกใช้ package Lo ก็ให้ติดตั้ง Lo เพิ่มเข้าไปด้วยคำสั่ง

go get github.com/samber/lo

เมื่อติดตั้งสำเร็จพร้อมให้เรียกใช้งาน สามารถเข้าไปดูรายชื่อฟังก์ชั่น (function names) และตัวอย่างการเรียกใช้งานได้จากที่นี่ Lo ซึ่งไม่ได้ยากมาก อาจจะต้องปรับเปลี่ยน type ไปตามแต่ละ อินพุธ (input data)

เริ่มการ import pacakge Lo เข้ามาใช้งาน

import "github.com/samber/lo"

เมื่อต้องการเรียกใช้งานฟังก์ชั่น Sum การรวมค่าทั้งหมด

total := lo.Sum([]int{1, 2, 3, 4, 5})
fmt.Printf("total::==%d", total)
// total::==15

ฟังก์ชั่นถัดมา Map การเปลี่ยนแปลงค่าแต่ละ item แต่ size ยังคงเดิม

result := lo.Map([]int{1, 2, 3, 4}, func(item int, _ int) int {
    return item * 2
})
fmt.Printf("result::==%d", result)
//result::==[2 4 6 8]

ฟังก์ชั่นถัดมา Sample การสุ่มตัวเลข

random := lo.Sample([]int{1, 2, 3})
fmt.Printf("random::==%d", random)
//random::==1

ฟังก์ชั่นถัดมา Some การตรวจสอบค่าบางค่าถ้ามีจะคืนค่าเป็น true

some := lo.Some([]int{0, 1, 2, 3, 4, 5}, []int{0})
fmt.Printf("some::==%t", some)
//some::==true

ฟังก์ชั่นถัดมา Every การตรวจสอบค่าทุกค่าถ้ามีจะคืนค่าเป็น true

every := lo.Every([]int{0, 1, 2, 3, 4, 5}, []int{0, 2})
fmt.Printf("every::==%t", every)
//every::==true

ฟังก์ชั่นถัดมา Keys คืนค่าเป็น key ของ map ทั้งหมด

keys := lo.Keys[string, int](map[string]int{"foo": 1, "bar": 2})
fmt.Printf("keys::==%v", keys)
//keys::==[foo bar]

ฟังก์ชั่นถัดมา Values คืนค่าเป็น value ของ map ทั้งหมด

values := lo.Values[string, int](map[string]int{"foo": 1, "bar": 2})
fmt.Printf("values::==%v", values)
//values::==[1 2]

สรุปท้ายบทความ

Lo สุดยอดเครื่องมือที่รวบรวมฟังก์ชั่นต่าง ๆ ไว้มากมาย หากได้เข้าไปดูซอสโค๊ด (source code) ของ package นี้บน github.com พื้นฐานของการพยายามหาผลลัพธ์คือการ loop ค่าที่ส่งเข้าไป โดยมีโค๊ดที่มีการนำ generics type ของ golang มาประยุกต์ใช้งานทำให้โค๊ดดูกระชับเป็นระเนียบมากขึ้น แต่ต้องบอกไว้นิดนึง Lo จะใช้ได้กับ project ของ go ที่เวอร์ชั่น (version) >=1.8 ขึ้นไปเท่านั้น แต่ถ้าคุณยังมีข้อจำกัดเรื่อง เวอร์ชั่น (version) ของ project คุณที่ต่ำกว่า < 1.8 ผมขอแนะนำ go-funk ก็สามารถใช้งานแทนได้ ขอบคุณที่ติดตามครับป๋ม

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *