DEV Community

Pallat Anchaleechamaikorn
Pallat Anchaleechamaikorn

Posted on

iota คืออะไรและวิธีใช้

สำหรับคนที่เขียน Go บางคนอาจจะเคยเห็นวิธีการทำ Enum ของ Go ด้วยการใช้ iota เข้ามาช่วย ยกตัวอย่างเช่น

type weekday int

const (
    sunday weekday = iota
    monday
    tuesday
)
Enter fullscreen mode Exit fullscreen mode

มีบางคนสงสัยว่า 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
)
Enter fullscreen mode Exit fullscreen mode

แบบนี้เราจะได้ค่า constant ตามนี้

zero = 0
one = 1
two = 2

หากต้องการ skip ค่าไหนก็สามารถใช้ _ ไปคั่นบรรทัดนั้นๆได้เลยเช่น

const (
    zero = iota
    _
    two
)
Enter fullscreen mode Exit fullscreen mode

แบบนี้เราก็จะยังได้ค่า two = 2 เหมือนเดิม

และเราสามารถแทก บรรทัดว่างๆหรือ comment ในระหว่างบรรทัดได้โดยไม่กระทบกับลำดับเลขเช่น

const (
    zero = iota

    one
    // comment
    two
)
Enter fullscreen mode Exit fullscreen mode

แบบนี้ เราก็ยังคงได้ลำดับ

zero = 0
one = 1
two = 2

เหมือนเดิม และอีกตัวอย่างการใช้การที่เห็นบ่อยก็คือการประกาศค่า data storage unit

const (
    _ = 1 << (iota * 10) // = 1 << 10
    KB
    MB
    GB
)
Enter fullscreen mode Exit fullscreen mode

หากต้องการเริ่มต้นลำดับใหม่ ก็เพียงแค่สร้าง const() กลุ่มใหม่ มันก็จะเริ่มต้นนับ 0 ใหม่ให้เอง
เห็นแบบนี้แล้วก็พอจะนึกวิธีใช้งานกันได้บ้างนะครับ หวังว่าจะเป็นประโยชน์

Top comments (2)

Collapse
 
dnjooiopa profile image
Kittisak Phormraksa

ตรง KB น่าจะต้องเป็น 1 << ((itoa+1) * 10) ไหมครับ

Collapse
 
pallat profile image
Pallat Anchaleechamaikorn

ขอบคุณครับ แก้เรียบร้อย 🙏