สำหรับคนที่เขียน Go บางคนอาจจะเคยเห็นวิธีการทำ Enum ของ Go ด้วยการใช้ iota
เข้ามาช่วย ยกตัวอย่างเช่น
type weekday int
const (
sunday weekday = iota
monday
tuesday
)
มีบางคนสงสัยว่า iota
คือคำย่อหรือเปล่า แล้วมันย่อมาจากคำว่าอะไรกันแน่ บางคนไปตั้งกระทู้ใน stackoverflow ถามก็มี ซึ่งคำตอบก็คือ นี่ไม่ใช่คำย่อแต่อย่างใด
iota เป็นตัวอักษรกรีกโบราณในลำดับที่ 9
Iota (/aɪˈoʊtə/; uppercase: Ι, lowercase: ι; Greek: ιώτα)
ซึ่งถูกนำมาใช้เป็นสัญลักษณ์ทางคณิตศาสตร์ เช่นตัว i ที่เราใช้ในการอ้างถึงจำนวนจินตภาพ หรือเป็นตัวแทนฟังก์ชั่นของ Inclusion Map
ในทาง programming ของเรา การนำ iota มาใช้ จากที่อ่านเจอน่าจะถูกนำมาใช้ในภาษา APL เนื่องจากภาษานี้ถูกสร้างขึ้นโดย Kenneth E. Iverson ซึ่งเป็นนักคณิตศาสตร์ และได้นำเอาสัญลักษณ์ iota เข้ามาใช้เป็นฟังก์ชั่นสำหรับสร้าง vector ของตัวเลข เริ่มที่เลข 1 ไปจนถึงเลขที่ระบุ (ลองอ่านดูใน Wiki เพิ่มเติม)
ต่อมาก็ถูกนำมาใช้ใน C++ และแม้ว่า Rob และ Ken จะแสดงตัวชัดเจนว่าไม่ค่อยจะชอบ C++ เท่าไรนัก ทำให้การที่ Go มี iota มาใช้ในลักษณะเดียวกัน คนก็ตั้งข้อสงสัยว่า อาจจะได้แรงบันดาลใจมาจาก APL มากกว่า
เล่ามาซะยาว มาดูวิธีใช้งานมันดีกว่า
iota ใช้สร้าง const เท่านั้น เรียกได้ว่าเป็นตัวช่วยทำ Enum ของ Go ก็ได้เช่นกัน โดยเมื่อเราสร้าง const แล้วระบุค่าเป็น iota มันจะสร้างลำดับตัวเลขเริ่มต้นที่เลข 0 และเพิ่มค่าทีละ 1 ไปเรื่อยๆให้เช่น
const (
zero = iota
one
two
)
แบบนี้เราจะได้ค่า constant ตามนี้
zero = 0
one = 1
two = 2
หากต้องการ skip ค่าไหนก็สามารถใช้ _
ไปคั่นบรรทัดนั้นๆได้เลยเช่น
const (
zero = iota
_
two
)
แบบนี้เราก็จะยังได้ค่า two = 2 เหมือนเดิม
และเราสามารถแทก บรรทัดว่างๆหรือ comment ในระหว่างบรรทัดได้โดยไม่กระทบกับลำดับเลขเช่น
const (
zero = iota
one
// comment
two
)
แบบนี้ เราก็ยังคงได้ลำดับ
zero = 0
one = 1
two = 2
เหมือนเดิม และอีกตัวอย่างการใช้การที่เห็นบ่อยก็คือการประกาศค่า data storage unit
const (
_ = 1 << (iota * 10) // = 1 << 10
KB
MB
GB
)
หากต้องการเริ่มต้นลำดับใหม่ ก็เพียงแค่สร้าง const() กลุ่มใหม่ มันก็จะเริ่มต้นนับ 0 ใหม่ให้เอง
เห็นแบบนี้แล้วก็พอจะนึกวิธีใช้งานกันได้บ้างนะครับ หวังว่าจะเป็นประโยชน์
Top comments (2)
ตรง KB น่าจะต้องเป็น 1 << ((itoa+1) * 10) ไหมครับ
ขอบคุณครับ แก้เรียบร้อย 🙏