📅 เขียนเมื่อ: กรกฎาคม 2026
⚠️ ตรวจสอบข้อมูลจาก Go Specification, APL documentation, และบันทึกของผู้พัฒนา
ถ้าคุณเขียน Go มาระยะหนึ่ง คุณคงเคยเห็น iota — เจ้า identifier ประหลาดที่ไม่มีใครรู้ว่ามันคืออะไรตอนเจอครั้งแรก
const (
Monday = iota + 1 // 1
Tuesday // 2
Wednesday // 3
)
มันไม่ใช่ 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
)
ค่า iota เริ่มที่ 0 และเพิ่มทีละ 1 ทุกครั้งที่เจอบรรทัดใหม่ใน const block — แม้ว่าบรรทัดนั้นจะไม่ได้ใช้ iota ก็ตาม
สิ่งที่ทำให้ iota ทรงพลังคือมันเป็น expression (ไม่ใช่แค่ตัวเลข) — คุณเอาไปคูณ บวก ลบ shift ได้หมด
const (
Read = 1 << iota // 1 << 0 = 1
Write // 1 << 1 = 2
Execute // 1 << 2 = 4
)
นี่คือวิธีมาตรฐานในการสร้าง 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
(เชื่อกันว่าใน 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 มิติ
และเมื่อรวมกับ operator ตัวอื่นของ APL — ⍳ กลายเป็นอาวุธที่ทรงพลังอย่างไม่น่าเชื่อ:
+/⍳100 → 5050 (ผลรวม 1..100 — ใน 4 ตัวอักษร)
+/⍳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,
};
เมื่อถึงเวลาออกแบบ Go — Pike รู้ดีว่าต้องมีอะไรดีกว่านี้
iota ใน Go — เกิดได้ยังไง
ปัญหาที่ต้องแก้
ทีม Go (Pike, Thompson, Griesemer) เริ่มออกแบบ Go ในปี 2007 — หนึ่งในเป้าหมายคือ: "ทำทุกอย่างให้ง่ายกว่า C"
constant declaration ใน C/C++ เป็นหนึ่งใน pain point:
- ต้องเขียนค่าให้ทุก constant — แม้มันจะ predictable
-
enumกับ#defineอยู่คนละโลก - bitmask/enum pattern ทำซ้ำซาก
ทีมต้องการอะไรที่:
- กระชับ — ไม่ต้องเขียนเลขซ้ำ
- flexible — ใช้กับ expression ได้ ไม่ใช่แค่ +1
- ไม่ใช่ magic — อ่านแล้วเข้าใจทันทีว่าเกิดอะไรขึ้น
ตัวเลือกที่ทีมไม่เอา
-
Auto-increment แบบ
enum— ใช้ได้แค่ +1, ทำ bitmask ไม่ได้ - Preprocessor macro — Go ไม่มี preprocessor (ตั้งใจ)
- Code generation — ซับซ้อนเกินสำหรับของง่าย ๆ
iota — ทางสายกลาง
Pike เสนอ iota — constant generator ที่:
-
Reset ทุก
constblock — scope ชัดเจน - เป็น expression — เอาไปคำนวณต่อได้
-
Reset เมื่อมี
constkeyword ใหม่ — predictable
const (
_ = iota // 0
KB = 1 << (10 * iota) // 1 << 10 = 1024
MB // 1 << 20
GB // 1 << 30
)
ส่วนชื่อ — ไม่ต้องคิดนาน: มันคือการยกย่อง (homage) ให้ APL — ภาษาที่สร้างแรงบันดาลใจให้กับคนสร้าง Unix, Plan 9, และ Go
วิธีใช้ iota แบบต่าง ๆ
1. Enum พื้นฐาน
type Season int
const (
Spring Season = iota // 0
Summer // 1
Autumn // 2
Winter // 3
)
2. Bitmask
type Permission uint8
const (
Read Permission = 1 << iota // 1
Write // 2
Execute // 4
Admin // 8
)
// ใช้:
var perm Permission = Read | Write // 3
3. Skip values
const (
_ = iota // 0 (skip)
Monday // 1
Tuesday // 2
Wednesday // 3
Thursday // 4
Friday // 5
Saturday // 6
Sunday // 7
)
4. Multiple expressions ในบรรทัดเดียวกัน
const (
bit0, mask0 = 1 << iota, 1<<iota - 1 // 1, 0
bit1, mask1 // 2, 1
bit2, mask2 // 4, 3
)
5. Jump pattern
const (
a = iota * 2 // 0
b // 2
c // 4
d // 6
)
ทำไม 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
)
vs C:
enum {
INFO = 0,
WARNING,
ERROR
};
น้อยกว่า — แต่บอกอะไรได้มากกว่า
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]+strumcrate ให้ความสามารถใกล้เคียง -
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
)
ที่มา: 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)