Go by Example မြန်မာဘာသာ: Sorting by Functions

တစ်ခါတလေ အက္ခရာစဉ် နံပါတ်စဉ် စသည် သဘာဝအစဉ်အလိုက် သာမက အခြားပုံစံမျိုးဖြင့် စဉ်ခြင်းမျိုးကိုလည်း ဆောင်ရွက်လိုပါလိမ့်မည်။ နမူနာအားဖြင့် ဆိုရသော် အက္ခရာစဉ်ခြင်းမျိုးမဟုတ်ပဲ အက္ခရာအလုံးအရေအတွက်အားဖြင့် စဉ်လိုသည်ဟု ယူဆပါစို့။ Go တွင် မိမိစဉ်လိုသည့် ပုံစံများကို အောက်ပါ နမူနာတွင် ကြည့်နိုင်သည်။

package main
import (
    "fmt"
    "sort"
)

Go မှာ custom function သုံးပြီး sort လုပ်မယ်ဆိုရင် အဲဒါနဲ့ ကိုက်တဲ့ data type တစ်ခုလိုတယ်။ ဒီမှာ byLength လို့ခေါ်တဲ့ custom type တစ်ခု ဖန်တီးထားတယ်။​ အဲဒါက တကယ်တော့ []string ကို နာမည်ပြောင်းခေါ်တာမျိုး ဖြစ်တယ်။ []string ဆိုတဲ့ type ကို byLength ဆိုတဲ့ type အနေနဲ့ သုံးမယ်ဆိုတာမျိုး။

type byLength []string

အပေါ်မှာ ဖန်တီးထားတဲ့ type အတွက် sort.Interface ရေးပေးဖို့လိုတယ်။ Len, Less၊ နဲ့ Swap လို့ခေါ်တဲ့ Interface ၃ ခု။ အဲဒီဟာတွေ ရေးပေးထားမှ sort package ထဲမှာရှိတဲ့ generic Sort function ကို သုံးလို့ရမှာ။ array လိုမျိုး type တွေအတွက်Len နဲ့ Swap အတွက် ရေးပေးရတဲ့ကုဒ်က ဆင်တူလေ့ရှိတယ်။ sort လုပ်တဲ့ logic ရှိတဲ့နေရာက Less interface ပဲ။​ အဲဒီမှာ sorting logic ကို သွားရေး ပေးထားရတယ်။ အခုကိစ္စမှာဆို string တိုးတာပဲဖြစ်ဖြစ် လျော့တာပဲဖြစ်ဖြစ် string length ကိုသုံးပြီး sort လုပ်ပေးပါဆိုပြီး ခိုင်းတာမျိုး။ အဲ့လို sort ဖြစ်ဖို့ len(s[i]) နဲ့ len(s[j]) တွေကို Less interface မှာ သုံးထားတယ်။

func (s byLength) Len() int {
    return len(s)
}
func (s byLength) Swap(i, j int) {
    s[i], s[j] = s[j], s[i]
}
func (s byLength) Less(i, j int) bool {
    return len(s[i]) < len(s[j])
}

လိုအပ်သည့် ကုဒ်များကို နေရာတကျ ရေးပြီးသည့်အခါ မူလ fruits slice ကို byLength အမျိုးအစားသို့ ပြောင်းလဲလိုက်ခြင်းအားဖြင့် မိမိစဉ်လိုသည့် လောဂျစ်ကို အကောင်အထည် ဖော်နိုင်သွားသည်။ ထို့နောက် ၎င်း byLength ကို စဉ်ရန် sort.Sort အသုံးပြုသည်။

func main() {
    fruits := []string{"peach", "banana", "kiwi"}
    sort.Sort(byLength(fruits))
    fmt.Println(fruits)
}

ပရိုဂရမ်ကို ခိုင်းစေလိုက်ပါက မိမိဖြစ်စေချင်သည့် အက္ခရာအလုံးအရေအတွက်ဖြင့် စဉ်ထားသော list ကို ပြသပါမည်။

$ go run sorting-by-functions.go
[kiwi peach banana]

စိတ်ကြိုက် ဒေတာအမျိုးအစားကို ဖန်တီးခြင်း၊ ၎င်းအမျိုးအစားအတွက် Interface method သုံးခုကို တည်ဆောက်ခြင်း၊ ၎င်းအမျိုးအစားကို အသုံးပြုထားသော collection တွင် sort.Sort အသုံးပြုပြီး စဉ်ခြင်း စသည့် ယခုလို ပုံစံမျိုးကို နမူနာယူပြီး Go slice များကို စိတ်ကြိုက် function များဖြင့် စဉ်နိုင်သည်။

နောက်ဥပမာ: Panic.