DEV Community

Pallat Anchaleechamaikorn
Pallat Anchaleechamaikorn

Posted on

1

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 ใหม่ให้เอง
เห็นแบบนี้แล้วก็พอจะนึกวิธีใช้งานกันได้บ้างนะครับ หวังว่าจะเป็นประโยชน์

AWS Security LIVE!

Tune in for AWS Security LIVE!

Join AWS Security LIVE! for expert insights and actionable tips to protect your organization and keep security teams prepared.

Learn More

Top comments (2)

Collapse
 
dnjooiopa profile image
Kittisak Phormraksa

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

Collapse
 
pallat profile image
Pallat Anchaleechamaikorn

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

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs