เริ่มต้นเขียนโปรแกรมด้วยภาษา Go
บทเรียนที่เหมาะกับผู้เริ่มต้นและมีประสบการณ์จริงเกี่ยวกับภาษาโปรแกรมมิ่ง Go โดยจัดเป็นบทเรียนเล็กๆ ที่จัดการได้ง่าย มีธีมการสำรวจอวกาศ ครอบคลุมหัวข้อการเขียนโปรแกรมแบบบังคับ ชนิดข้อมูล ฟังก์ชัน เมธอด เซ็ตข้อมูล สถานะ และการประมวลผลพร้อมกัน
บทเรียน
ภาพรวมคอร์สเรียน
📚 สรุปเนื้อหา
บทเรียนที่เข้าใจง่ายและใช้งานจริงสำหรับผู้เริ่มต้นกับภาษาโปรแกรม Go หลักสูตรนี้จัดทำเป็นบทเรียนเล็กๆ ที่จัดการได้ พร้อมธีมการสำรวจอวกาศ ครอบคลุมหัวข้อเกี่ยวกับการเขียนโปรแกรมเชิงบังคับ ประเภทข้อมูล ฟังก์ชัน เมธอด โครงสร้างข้อมูล สถานะ และความขนาน (concurrency)
ค้นพบความสนุกของการเขียนโค้ดด้วยภาษา Go ผ่านบทเรียนเล็กๆ และโครงการปลายทางทั้งหมด 7 โปรเจกต์ที่เกี่ยวข้องกับการเดินทางในอวกาศ
ผู้เขียน: นาธาน ยังแมน, โรเจอร์ เปปเป้
ขอบคุณ: เจนนิเฟอร์ สตาวต์, มารีนา มิคาเอลส์, เมธาเวอร์ มิร์เคส, โจเอล โคตาร์สกี, อเล็กซานดาร์ ดรากอสฟเยวิช, รีนี ฟรานซ์, โอลกา ชาลาฆินา, เอริก ซีลยา, เอบริล มิลน์, มอนิกา แคมสวาอา
🎯 เป้าหมายการเรียนรู้
- นิยามภาษาโปรแกรม Go และกรณีการใช้งานหลักของมัน
- อธิบายบทบาทของคอมไพเลอร์ภาษา Go และข้อดีเหนือตัวแปลโปรแกรม (interpreter)
- ใช้งาน Go Playground เพื่อเขียน คอมไพล์ และรันโค้ด
- จัดโครงสร้างโค้ดภาษา Go อย่างถูกต้องตาม "สไตล์เครื่องหมายวงเล็บแบบเดียว" ที่จำเป็น เพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์
- จัดการข้อมูลโดยใช้เทคนิคการประกาศตัวแปรต่างๆ และตัวดำเนินการรวมค่าทางคณิตศาสตร์
- สร้างเลขสุ่มเทียม และนำตรรกะเงื่อนไขมาใช้ผ่านการแยกทาง (branching) และตัวดำเนินการตรรกะ
- ประกาศและจัดรูปแบบตัวแปรทศนิยมโดยใช้
float32และfloat64พร้อมขนาดและความแม่นยำเฉพาะ - ระบุและลดผลกระทบจากข้อผิดพลาดที่เกิดจากความไม่แม่นยำของเลขทศนิยมและค่าเต็มที่เกินขอบเขต (integer wrap-around)
- ใช้แพ็กเกจ
bigและค่าคงที่ไม่มีประเภท (untyped constants) เพื่อจัดการกับจำนวนที่เกินขีดจำกัดขนาดบิตมาตรฐาน - กำหนดและเรียกใช้ฟังก์ชันโดยใช้พารามิเตอร์ อาร์กิวเมนต์ และไวยากรณ์แบบตัวแปร (variadic syntax)
🔹 บทเรียนที่ 1: ออกจากโลกสู่วงโคจร
ภาพรวม: บทเรียนนี้แนะนำภาษา Go ซึ่งเป็นภาษาโปรแกรมสมัยใหม่ที่ใช้กันอย่างแพร่หลายในระบบคลาวด์ นักเรียนจะได้เรียนรู้ความแตกต่างพื้นฐานระหว่างภาษา Go ที่ถูกคอมไพล์ กับภาษาที่ถูกแปลความ (interpreted) การใช้งาน Go Playground เพื่อทดลองเขียนโค้ดทันที และโครงสร้างพื้นฐานของโปรแกรมภาษา Go ที่เกี่ยวข้องกับแพ็กเกจและฟังก์ชัน main
ผลการเรียนรู้:
- นิยามภาษาโปรแกรม Go และกรณีการใช้งานหลักของมัน
- อธิบายบทบาทของคอมไพเลอร์ภาษา Go และข้อดีเหนือตัวแปลโปรแกรม (interpreter)
- ใช้งาน Go Playground เพื่อเขียน คอมไพล์ และรันโค้ด
🔹 บทเรียนที่ 2: ตรรกะศูนย์ควบคุมภารกิจ
ภาพรวม: บทเรียนนี้แนะนำหัวใจสำคัญของการเขียนโปรแกรมด้วยภาษา Go โดยเน้นที่การจัดโครงสร้างโค้ดและการควบคุมลำดับการทำงาน นักเรียนจะได้เรียนรู้ "สไตล์เครื่องหมายวงเล็บแบบเดียว" และจุดเริ่มต้นของโปรแกรม แล้วค่อยๆ เข้าสู่เทคนิคการประกาศตัวแปรที่รวดเร็ว ตัวดำเนินการทางคณิตศาสตร์ และจบลงด้วยตรรกะการตัดสินใจโดยใช้ค่าบูลีน การเปรียบเทียบ และการแยกทาง (branching)
ผลการเรียนรู้:
- จัดโครงสร้างโค้ดภาษา Go อย่างถูกต้องตาม "สไตล์เครื่องหมายวงเล็บแบบเดียว" ที่จำเป็น เพื่อหลีกเลี่ยงข้อผิดพลาดทางไวยากรณ์
- จัดการข้อมูลโดยใช้เทคนิคการประกาศตัวแปรต่างๆ และตัวดำเนินการรวมค่าทางคณิตศาสตร์
- สร้างเลขสุ่มเทียม และนำตรรกะเงื่อนไขมาใช้ผ่านการแยกทาง (branching) และตัวดำเนินการตรรกะ
🔹 บทเรียนที่ 3: ฟิสิกส์ของข้อมูลอวกาศ
ภาพรวม: บทเรียนนี้สำรวจวิธีที่ภาษา Go จัดการกับข้อมูลตัวเลข ตั้งแต่ความละเอียดของเลขทศนิยม ไปจนถึงขนาดที่ใหญ่มากเพื่อใช้คำนวณระยะทางในจักรวาล นักเรียนจะได้เรียนรู้การจัดการข้อจำกัดของหน่วยความจำคอมพิวเตอร์ เช่น ความไม่แม่นยำของเลขทศนิยม และค่าเต็มที่เกินขอบเขต (integer wrap-around) พร้อมทักษะในการแปลงประเภทอย่างชัดเจน และการใช้แพ็กเกจ big เพื่อจัดการกับขนาดตัวเลขที่แปลกประหลาด
ผลการเรียนรู้:
- ประกาศและจัดรูปแบบตัวแปรทศนิยมโดยใช้
float32และfloat64พร้อมขนาดและความแม่นยำเฉพาะ - ระบุและลดผลกระทบจากข้อผิดพลาดที่เกิดจากความไม่แม่นยำของเลขทศนิยมและค่าเต็มที่เกินขอบเขต (integer wrap-around)
- ใช้แพ็กเกจ
bigและค่าคงที่ไม่มีประเภท (untyped constants) เพื่อจัดการกับจำนวนที่เกินขีดจำกัดขนาดบิตมาตรฐาน
🔹 บทเรียนที่ 4: สร้างโมดูลที่แยกจากกันได้
ภาพรวม: บทเรียนนี้กล่าวถึงหัวใจสำคัญของโปรแกรมภาษา Go ได้แก่ ฟังก์ชัน ประเภทที่กำหนดเอง และเมธอด นักเรียนจะได้เรียนรู้วิธีการห่อหุ้มตรรกะเพื่อใช้ซ้ำ กำหนดประเภทใหม่ที่มีพฤติกรรมเฉพาะ และใช้ฟังก์ชันระดับแรก (first-class functions) รวมถึงฟังก์ชันที่ไม่มีชื่อ (anonymous functions) และคลอเจอร์ (closures) เพื่อสร้างโค้ดที่ยืดหยุ่นและแยกส่วนได้ บทเรียนสิ้นสุดด้วยโปรเจกต์ปลายทางที่ใช้การแปลงตารางอุณหภูมิ
ผลการเรียนรู้:
- กำหนดและเรียกใช้ฟังก์ชันโดยใช้พารามิเตอร์ อาร์กิวเมนต์ และไวยากรณ์แบบตัวแปร (variadic syntax)
- แยกแยะตัวระบุที่เปิดเผย (exported) และไม่เปิดเผย (unexported) ด้วยกฎการตั้งชื่อของภาษา Go
- สร้างประเภทที่กำหนดเองและผูกพฤติกรรมไว้กับมันโดยใช้เมธอดและรีซีฟเวอร์ (receivers)
🔹 บทเรียนที่ 5: บรรจุสินค้าในห้องสัมภาระ
ภาพรวม: บทเรียนนี้กล่าวถึงโครงสร้างข้อมูลพื้นฐานในภาษา Go สำหรับจัดการข้อมูลจำนวนมาก มันเริ่มจากการจัดการอาร์เรย์ที่มีความยาวคงที่และพฤติกรรมการคัดลอกหน่วยความจำ แล้วเปลี่ยนไปยังสไลซ์ที่มีความยืดหยุ่นเพื่อเข้าถึงข้อมูล และสุดท้ายคือแมพ (maps) สำหรับการค้นหาค่าโดยใช้คีย์ได้อย่างมีประสิทธิภาพ หน่วยงานสิ้นสุดลงด้วยโปรเจกต์ปลายทาง "เกมของชีวิต" ที่แสดงให้เห็นวิธีใช้สไลซ์หลายมิติเพื่อจำลองระบบที่ซับซ้อน
ผลการเรียนรู้:
- ประกาศ ตั้งค่า และวนลูปผ่านอาร์เรย์ที่มีความยาวคงที่และตารางหลายมิติ
- จัดการสไลซ์โดยใช้ช่วงดัชนี และขยายขนาดได้โดยใช้ฟังก์ชัน
append - จัดการประสิทธิภาพหน่วยความจำโดยแยกแยะระหว่างความยาว (length) และความจุ (capacity) และจัดสรรทรัพยากรล่วงหน้าด้วย
make
🔹 บทเรียนที่ 6: จัดวางบ้านพักบนดาวอังคาร
ภาพรวม: บทเรียนนี้แนะนำแนวทางของภาษา Go ในการจัดระเบียบข้อมูลและพฤติกรรมที่ซับซ้อน นักเรียนจะได้เรียนรู้วิธีจัดกลุ่มประเภทข้อมูลที่ต่างกันเข้าด้วยกันเป็นโครงสร้าง (structs) ตั้งค่าเริ่มต้นด้วยคอมโพสิตลิเตอรัล (composite literals) และจัดการพฤติกรรมของมันผ่านเมธอดและฟังก์ชันสร้าง (constructor functions) บทเรียนยังสำรวจปรัชญาการออกแบบที่โดดเด่นของภาษา Go นั่นคือ ให้ความสำคัญกับการประกอบ (composition) มากกว่าการสืบทอด (inheritance) และใช้อินเทอร์เฟซที่แฝงอยู่ (implicit interfaces) เพื่อให้เกิดโพลีมอร์ฟิซึม (polymorphism)
ผลการเรียนรู้:
- กำหนด ตั้งค่า และคัดลอกโครงสร้างเพื่อจัดการข้อมูลพิกัดของดาวอังคารและรถสำรวจ
- เข้ารหัสโครงสร้างภาษา Go ให้อยู่ในรูปแบบ JSON โดยใช้แท็กโครงสร้าง (struct tags) เพื่อการแลกเปลี่ยนข้อมูลที่ปรับแต่งได้
- ใช้เมธอด ฟังก์ชันสร้าง และการฝังโครงสร้าง (struct embedding) เพื่อสร้างโค้ดที่สามารถนำไปใช้ซ้ำและจัดระเบียบได้
🔹 บทเรียนที่ 7: ค้นหาทางผ่านถ้ำก็อฟเฟอร์
ภาพรวม: บทเรียนนี้สำรวจพลังและความปลอดภัยของการใช้การอ้างอิง (indirection) ในภาษา Go โดยเน้นว่าการใช้พอยเตอร์ช่วยให้สามารถเปลี่ยนแปลงข้อมูลได้อย่างมีประสิทธิภาพและจัดการหน่วยความจำได้ดี บทเรียนนี้ให้กรอบการทำงานที่แข็งแรงสำหรับการเขียนโปรแกรมเชิงป้องกัน โดยสอนนักเรียนให้จัดการค่า nil จัดการทรัพยากรด้วยคำสั่ง defer และใช้รูปแบบการจัดการข้อผิดพลาดที่เหมาะสม — ซึ่งสุดท้ายนำไปประยุกต์ใช้กับเครื่องตรวจสอบซูโดกุ
ผลการเรียนรู้:
- ใช้เครื่องหมาย
&และ*เพื่อจัดการที่อยู่หน่วยความจำ และดีเรเฟอเรนซ์ (dereference) ค่า - ใช้พารามิเตอร์และรีซีฟเวอร์ที่เป็นพอยเตอร์เพื่อให้สามารถเปลี่ยนแปลงข้อมูลภายในฟังก์ชันและเมธอดได้
- จัดการค่า
nilในสไลซ์ แมพ และอินเทอร์เฟซโดยไม่ก่อให้เกิดข้อผิดพลาดที่เวลาทำงาน (runtime panic)
🔹 บทเรียนที่ 8: การสื่อสารระหว่างรถสำรวจหลายคัน
ภาพรวม: บทเรียนนี้แนะนำเครื่องมือหลักด้านการขนาน (concurrency) ของภาษา Go ได้แก่ โกรูติน (goroutines) และช่องสื่อสาร (channels) มันสำรวจวิธีการดำเนินงานที่แยกจากกัน วิธีสื่อสารอย่างปลอดภัยระหว่างกัน และการจัดการสถานะร่วมกันด้วยมิวทิกซ์ (Mutexes) เพื่อหลีกเลี่ยงภาวะแข่งขัน (race conditions) บทเรียนสิ้นสุดด้วยโปรเจกต์ปลายทางที่จำลองรถสำรวจบนดาวอังคารที่เคลื่อนที่ผ่านตารางและรายงานการค้นพบ
ผลการเรียนรู้:
- รันและจัดการงานขนานโดยใช้คำสั่ง
go - ใช้ช่องสื่อสารและคำสั่ง
selectเพื่อสื่อสารอย่างปลอดภัยระหว่างโกรูติน - สร้างสายการไหลของข้อมูล (data pipelines) และจัดการวงจรชีวิตของโกรูตินโดยปิดช่องสื่อสาร