DEV Community

Gophernment
Gophernment

Posted on

"iota ใน Go — อักษรกรีกตัวจิ๋วที่กลายเป็นเครื่องมือทรงพลัง"

📅 เขียนเมื่อ: กรกฎาคม 2026
⚠️ ตรวจสอบข้อมูลจาก Go Specification, APL documentation, และบันทึกของผู้พัฒนา


ถ้าคุณเขียน Go มาระยะหนึ่ง คุณคงเคยเห็น iota — เจ้า identifier ประหลาดที่ไม่มีใครรู้ว่ามันคืออะไรตอนเจอครั้งแรก

const (
    Monday = iota + 1  // 1
    Tuesday            // 2
    Wednesday          // 3
)
Enter fullscreen mode Exit fullscreen mode

มันไม่ใช่ keyword, ไม่ใช่ type, ไม่ใช่ function — มันคืออะไรกันแน่?

และที่สำคัญ — ทำไมต้องชื่อ iota?

คำตอบพาเราย้อนกลับไปถึงปี 1962 — ถึงนักคณิตศาสตร์ชาวแคนาดาคนหนึ่ง และภาษาโปรแกรมมิ่งที่เปลี่ยนโลก


iota คืออะไรใน Go

ใน Go spec — iota คือ predeclared identifier ที่ใช้ เฉพาะใน const declaration เท่านั้น

มันทำสิ่งเดียว: นับเลขให้อัตโนมัติ

const (
    _ = iota          // 0 (skip)
    KB = 1 << (10 * iota)  // 1 << 10 = 1024
    MB                    // 1 << 20 = 1,048,576
    GB                    // 1 << 30
)
Enter fullscreen mode Exit fullscreen mode

ค่า iota เริ่มที่ 0 และเพิ่มทีละ 1 ทุกครั้งที่เจอบรรทัดใหม่ใน const block — แม้ว่าบรรทัดนั้นจะไม่ได้ใช้ iota ก็ตาม

สิ่งที่ทำให้ iota ทรงพลังคือมันเป็น expression (ไม่ใช่แค่ตัวเลข) — คุณเอาไปคูณ บวก ลบ shift ได้หมด

const (
    Read    = 1 << iota  // 1 << 0 = 1
    Write                 // 1 << 1 = 2
    Execute               // 1 << 2 = 4
)
Enter fullscreen mode Exit fullscreen mode

นี่คือวิธีมาตรฐานในการสร้าง enum, bitmask, และ constant series ใน Go — ทั้งหมดด้วย keyword เดียว


iota — อักษรกรีกตัวเล็กที่สุด

ก่อนจะเป็นชื่อใน Go — ιώτα (iota) คืออักษรตัวที่ 9 ของกรีกโบราณ: ι

มันคืออักษรที่ เล็กที่สุด ในภาษากรีก — แค่เส้นตรงหนึ่งเส้น ไม่มีหาง ไม่มีขีด

ในพระคัมภีร์ไบเบิล มีวลี famous: "not one iota" — แปลว่า "ไม่แม้แต่นิดเดียว" — เพราะ iota คือสิ่งที่เล็กที่สุด

และมันคือชื่อที่สมบูรณ์แบบสำหรับสิ่งที่ "เพิ่มทีละหนึ่ง"


จุดเริ่มต้น — APL และ Kenneth Iverson

นักคณิตศาสตร์ผู้สร้างภาษา

ปี 1962 — Kenneth E. Iverson ตีพิมพ์หนังสือ "A Programming Language" (ที่มาของชื่อ APL)

Iverson เป็นนักคณิตศาสตร์ชาวแคนาดา (ต่อมาได้ Turing Award ปี 1979) — เขาไม่ได้แค่ออกแบบภาษาใหม่ แต่ปฏิวัติวิธีคิดเรื่อง programming

แทนที่จะเขียน for i = 1 to 10 — Iverson คิดว่า programming ควรเหมือนคณิตศาสตร์: สั้น, สัญลักษณ์, และทรงพลัง

เกิดเป็น ⍳ (iota)

ใน APL, Iverson สร้าง operator — เรียกว่า iota — ที่ทำสิ่งเดียว: สร้างลำดับเลข

5      1 2 3 4 5
10     1 2 3 4 5 6 7 8 9 10
Enter fullscreen mode Exit fullscreen mode

(เชื่อกันว่าใน APL ดั้งเดิม ใช้ตัวอักษรกรีก ι จริง ๆ — Iverson notation ยุค 1957 ใช้สัญลักษณ์คณิตศาสตร์แบบกรีก ก่อนที่ APL จะพัฒนาชุดอักขระเฉพาะของตัวเอง จนได้สัญลักษณ์ ที่เราเห็นใน APL สมัยใหม่)

ทำไมต้องชื่อ iota? — Iverson เลือกเพราะมันคือ อักษรที่เล็กที่สุด → เหมาะกับ operator ที่สร้าง "สิ่งที่เล็กที่สุด" (integer unit)

ปรัชญาของ Iverson: โปรแกรมมิ่งคือภาษาสำหรับ คิด — ไม่ใช่แค่ภาษาสำหรับ บอกคอมพิวเตอร์ให้ทำงาน

APL พิสูจน์ว่า: โค้ดหนึ่งบรรทัดที่เต็มไปด้วยสัญลักษณ์ประหลาด สามารถทำสิ่งที่ภาษาอื่นใช้ 50 บรรทัด

และ (iota) คือหัวใจของแนวคิดนี้ — สร้างลำดับจากความว่างเปล่า ด้วยสัญลักษณ์เดียว

สิ่งที่ APL iota ทำได้ — มากกว่าแค่นับเลข

APL iota ไม่ได้สร้างแค่ 1 2 3 — มันสร้างได้ทุกมิติ:

3 3     matrix 3×3 ของเลข 1..9
2 3 4   array 3 มิติ
Enter fullscreen mode Exit fullscreen mode

และเมื่อรวมกับ operator ตัวอื่นของ APL — กลายเป็นอาวุธที่ทรงพลังอย่างไม่น่าเชื่อ:

+/100     5050   (ผลรวม 1..100  ใน 4 ตัวอักษร)
Enter fullscreen mode Exit fullscreen mode

+/⍳100 — สี่ตัวอักษร คำนวณผลรวม 1 ถึง 100 — โค้ดที่ภาษาอื่นต้องใช้ loop

นี่คือเหตุผลที่ APL ถูกเรียกว่า "ภาษาโปรแกรมมิ่งที่ทรงพลังที่สุดต่อจำนวนตัวอักษร"


จาก APL สู่ Bell Labs — เส้นทางของ iota

Ken Thompson กับ APL

ช่วงปลายยุค 60 — Ken Thompson (ผู้สร้าง Unix) เป็นคนหนึ่งที่หลงรัก APL

เขาเขียน APL interpreter ด้วยตัวเอง — เช่นเดียวกับสมาชิกทีม Go อีกสองคน (Rob Pike และ Robert Griesemer) ที่ต่างคนต่างเคยเขียน APL interpreter มาก่อนเช่นกัน นี่คือจุดร่วมสำคัญที่ทำให้ทั้งสามคน "พูดภาษาเดียวกัน" เมื่อถึงเวลาออกแบบ Go

มีบันทึกว่า Thompson เคยพูดว่า APL เป็นหนึ่งในแรงบันดาลใจสำคัญในการออกแบบ Unix philosophy — "ทำสิ่งเดียวแต่ทำให้ดี"

เขาไม่ได้เอา APL syntax มาใช้ (Unix กับ Go ต่างจาก APL คนละขั้ว) — แต่เขาเอา วิธีคิด มา: abstraction ที่ทรงพลัง, ความกระชับ, และความงามทางคณิตศาสตร์

Bell Labs — แหล่งรวมคนที่รู้จัก iota

Bell Labs ช่วงยุค 70-80 คือสถานที่ที่รวมตัวนักคณิตศาสตร์-โปรแกรมเมอร์ที่เข้าใจ APL:

  • Ken Thompson — ผู้สร้าง Unix, เขียน APL interpreter เอง
  • Rob Pike — โตมาในยุคที่ APL เป็นตำนาน, เขียน APL interpreter เอง
  • Robert Griesemer — ผู้ร่วมสร้าง Go, ก็เขียน APL interpreter ด้วยตัวเองเช่นกัน

นี่คือเหตุผลที่แท้จริงที่ทำให้ชื่อ iota รู้สึก "ใช่" สำหรับทั้งทีม — ไม่ใช่แค่คนใดคนหนึ่งเสนอแล้วคนอื่นพยักหน้าตาม แต่ทั้งสามคนเข้าใจว่ามันคืออะไรและมาจากไหน

ทุกคนในทีมที่สร้าง Unix, Plan 9, และต่อมา Go — รู้ว่า iota คืออะไรและมาจากไหน

แนวคิด "sequence generator" ในตระกูล Unix

ระหว่างทางจาก APL สู่ Go — แนวคิด iota ไม่ได้หายไป:

  • C language (1972): enum — สร้าง constant sequence ได้ แต่ต้องประกาศชื่อ
  • Plan 9 C: ปรับปรุง enum ให้ cleaner ขึ้น
  • Limbo (Inferno OS): constant declaration ที่ใกล้เคียง Go มากขึ้น

Pike และทีมเห็นว่า — การสร้าง enum/constant series ใน C น่าเบื่อและ verbose — ต้องเขียนเลขเองทุกบรรทัด

// C — ต้องเขียนเลขเอง
enum {
    READ  = 1 << 0,
    WRITE = 1 << 1,
    EXEC  = 1 << 2,
};
Enter fullscreen mode Exit fullscreen mode

เมื่อถึงเวลาออกแบบ Go — Pike รู้ดีว่าต้องมีอะไรดีกว่านี้


iota ใน Go — เกิดได้ยังไง

ปัญหาที่ต้องแก้

ทีม Go (Pike, Thompson, Griesemer) เริ่มออกแบบ Go ในปี 2007 — หนึ่งในเป้าหมายคือ: "ทำทุกอย่างให้ง่ายกว่า C"

constant declaration ใน C/C++ เป็นหนึ่งใน pain point:

  1. ต้องเขียนค่าให้ทุก constant — แม้มันจะ predictable
  2. enum กับ #define อยู่คนละโลก
  3. bitmask/enum pattern ทำซ้ำซาก

ทีมต้องการอะไรที่:

  • กระชับ — ไม่ต้องเขียนเลขซ้ำ
  • flexible — ใช้กับ expression ได้ ไม่ใช่แค่ +1
  • ไม่ใช่ magic — อ่านแล้วเข้าใจทันทีว่าเกิดอะไรขึ้น

ตัวเลือกที่ทีมไม่เอา

  • Auto-increment แบบ enum — ใช้ได้แค่ +1, ทำ bitmask ไม่ได้
  • Preprocessor macro — Go ไม่มี preprocessor (ตั้งใจ)
  • Code generation — ซับซ้อนเกินสำหรับของง่าย ๆ

iota — ทางสายกลาง

Pike เสนอ iota — constant generator ที่:

  1. Reset ทุก const block — scope ชัดเจน
  2. เป็น expression — เอาไปคำนวณต่อได้
  3. Reset เมื่อมี const keyword ใหม่ — predictable
const (
    _  = iota             // 0
    KB = 1 << (10 * iota)  // 1 << 10 = 1024
    MB                     // 1 << 20
    GB                     // 1 << 30
)
Enter fullscreen mode Exit fullscreen mode

ส่วนชื่อ — ไม่ต้องคิดนาน: มันคือการยกย่อง (homage) ให้ APL — ภาษาที่สร้างแรงบันดาลใจให้กับคนสร้าง Unix, Plan 9, และ Go


วิธีใช้ iota แบบต่าง ๆ

1. Enum พื้นฐาน

type Season int

const (
    Spring Season = iota  // 0
    Summer                // 1
    Autumn                // 2
    Winter                // 3
)
Enter fullscreen mode Exit fullscreen mode

2. Bitmask

type Permission uint8

const (
    Read    Permission = 1 << iota  // 1
    Write                           // 2
    Execute                         // 4
    Admin                           // 8
)

// ใช้:
var perm Permission = Read | Write  // 3
Enter fullscreen mode Exit fullscreen mode

3. Skip values

const (
    _ = iota          // 0 (skip)
    Monday            // 1
    Tuesday           // 2
    Wednesday         // 3
    Thursday          // 4
    Friday            // 5
    Saturday          // 6
    Sunday            // 7
)
Enter fullscreen mode Exit fullscreen mode

4. Multiple expressions ในบรรทัดเดียวกัน

const (
    bit0, mask0 = 1 << iota, 1<<iota - 1  // 1, 0
    bit1, mask1                           // 2, 1
    bit2, mask2                           // 4, 3
)
Enter fullscreen mode Exit fullscreen mode

5. Jump pattern

const (
    a = iota * 2    // 0
    b               // 2
    c               // 4
    d               // 6
)
Enter fullscreen mode Exit fullscreen mode

ทำไม iota ถึง "ใช่" สำหรับ Go

1. Philosophy match

Go มีหลักการ "หนึ่งวิธีที่ดีที่สุด" (one way to do it) — ต่างจาก Python ("หลายวิธีก็ดี") และ C++ ("มีทุกวิธี")

iota คือ "หนึ่งวิธี" ในการสร้าง enum/constant series — ใน Go คุณไม่ต้องเลือกว่าจะใช้ #define, enum, หรือ constexpr — มีแค่ iota

2. Zero cost abstraction

iota ไม่มี overhead — มันถูก resolve ตอน compile — runtime ไม่รู้ด้วยซ้ำว่ามี iota อยู่

3. Readability

เมื่อคุณเห็น iota — คุณรู้ทันทีว่า "อ๋อ ชุดนี้เป็นลำดับ"

const (
    Info = iota
    Warning
    Error
)
Enter fullscreen mode Exit fullscreen mode

vs C:

enum {
    INFO = 0,
    WARNING,
    ERROR
};
Enter fullscreen mode Exit fullscreen mode

น้อยกว่า — แต่บอกอะไรได้มากกว่า

4. Connection to history

iota เป็นหนึ่งใน easter egg ที่สวยงามของ Go — มันเชื่อมต่อกับ:

  • APL (1962) — ต้นกำเนิด
  • Bell Labs — สถานที่ที่ Thompson, Ritchie, Pike ทำงาน
  • Unix philosophy — ทำสิ่งเดียวให้ดี

นอกเรื่องนิดหน่อย — iota ในภาษาอื่น

หลังจาก Go ใช้ iota — หลายภาษาเริ่ม implement concept คล้าย ๆ กัน:

  • Rust: ไม่มี iota โดยตรง แต่ enum + #[repr] + strum crate ให้ความสามารถใกล้เคียง
  • Zig: enum มี auto-increment แต่ไม่ flexible เท่า iota
  • Swift: enum รองรับ raw value แต่ต้องระบุ type

ไม่มีใครทำได้สะอาดเท่า Go — เพราะไม่มีใครกล้าใช้ชื่อ iota (หรืออาจเพราะไม่มีใครรู้ว่ามันคืออะไร)


สิ่งที่ iota สอนเรา

ชื่อดีเปลี่ยนทุกอย่าง

iota ใน Go ทำแค่ auto-increment — เหมือน __COUNTER__ ใน C, enumerate ใน Python

แต่เพราะชื่อมัน — iota กลายเป็นมากกว่า feature: มันคือ เรื่องราว

ทุกครั้งที่โปรแกรมเมอร์ Go สงสัยว่า "iota คืออะไร" — พวกเขาย้อนกลับไปถึง APL, ถึง Kenneth Iverson, ถึง Bell Labs, ถึงประวัติศาสตร์ของภาษาโปรแกรมมิ่ง

และนั่นคือสิ่งที่ภาษาโปรแกรมมิ่งที่ดีทำ — ไม่ใช่แค่แก้ปัญหา แต่ เล่าเรื่อง


สรุป

iota เริ่มจากอักษรกรีกตัวเล็กที่สุด → กลายเป็น operator ใน APL (1962) → ถูกจดจำโดยทีม Bell Labs → และมาอยู่ใน Go ในฐานะ homage ให้กับประวัติศาสตร์ของ programming

มันใช้เวลา 50 ปี — จากแนวคิดทางคณิตศาสตร์ สู่ภาษาโปรแกรมมิ่งที่ใช้ใน production ทั่วโลก

และทั้งหมดเริ่มจากสัญลักษณ์เดียว: ι

// 50 ปีของการเดินทาง — ใน 4 บรรทัด
const (
    APL    = iota  // 1962
    Unix           // 1969
    Go             // 2009
)
Enter fullscreen mode Exit fullscreen mode

ที่มา: Go Language Specification, "A Programming Language" โดย Kenneth Iverson (1962), Rob Pike's talks on Go design, Bell Labs oral history, APL Wiki

Top comments (0)