Back to notes
mastery-backend-go
Featured

Go (Golang) for Backend: พลังแห่งความเรียบง่ายที่ Scale ได้จริง

ทำไมบริษัทระดับโลกอย่าง Google หรือ Uber ถึงย้ายมาใช้ Go? เจาะลึกปรัชญาความเรียบง่าย และพลังของ Goroutines ที่เปลี่ยนโลกของ Concurrency

January 30, 20262 min read readNNexis by Seereen

🛑 1. The Problem First: "ความซับซ้อนที่ควบคุมไม่ได้"

ลองนึกถึงระบบ Backend ขนาดใหญ่ที่เขียนด้วยภาษาแบบ OOP จัดๆ:

HLJS JAVA
// ❌ สถานการณ์ในภาษาอื่น: ความเวิ่นเว้อของโครงสร้าง
public class UserManager extends AbstractBaseManager implements IUserManager {
    @Override
    public User registerUser(UserDTO dto) throws UserRegistrationException {
        // ... โค้ดที่ซ่อนอยู่ในลอจิกซับซ้อนและมี Exception แฝงอยู่ทุุกที่
    }
}

ปัญหา: เมื่อโปรเจกต์ใหญ่ขึ้น ภาษาที่มีฟีเจอร์เยอะเกินไป (Inheritance, Generics ซ้อนกัน, Async/Await ที่เข้าใจยาก) จะทำให้ทีมงานคุยกันไม่รู้เรื่อง และการไล่บั๊ก (Debugging) กลายเป็นเรื่องน่าปวดหัว Go ถูกสร้างขึ้นมาเพื่อ "ตัดทิ้ง" สิ่งที่ไม่จำเป็น และบังคับให้ทุกคนเขียนโค้ดที่ "โง่แต่ชัดเจน" เพื่อป้องกันปัญหาในระยะยาวครับ


💡 2. Real-Life Analogy: ร้านอาหารที่ไม่มีหัวหน้ากุ๊ก

  • No Framework/Class: เหมือน "ร้านสตรีทฟู้ดที่มีเมนูเดียว". ทุุกคนรู้หน้าที่ชัดเจน ไม่ต้องมีคนสั่งงานซ้อนกันหลายชั้น (Inheritance) ทุุกคนทำอาหารแบบเดียวกัน คุณภาพเท่ากัน
  • Goroutines: เหมือน "กองทัพมดที่ช่วยกันแบกของ". แทนที่คุณจะมีพนักงานตัวโตๆ (Thread) แค่ 10 คน Go มีมดตัวเล็กๆ (Goroutine) เป็นล้านตัวที่ช่วยกันทำงานพร้อมกัน โดยกินทรัพยากรน้อยมาก
  • Channels: เหมือน "สายพานส่งอาหาร". มดแต่ละตัวไม่ต้องคุยกันโดยตรง แค่วางอาหารลงบนสายพาน (Channel) แล้วมดตัวต่อไปจะหยิบไปทำหน้าที่ต่อเองอย่างปลอดภัย

🚀 3. Execution Journey: มหากาพย์การเช็ค Error และ Concurrency

หัวใจของ Go คือการเผชิญหน้ากับความจริง (Error Handling) และการทำงานขนานกัน

🛠 Step-by-step:

  1. Explicit Error Check: เช็ค if err != nil ทุกบรรทัดที่สำคัญ เพื่อความโปร่งใส
  2. The Defer Keyword: สั่งปิด Resource (เช่น File, Database) ตั้งแต่บรรทัดที่เปิด เพื่อกันลืม
  3. Go Keyword: บัพฟ์ฟังก์ชันให้รันเป็น Background Task ทันทีด้วยการเติมคำว่า go
  4. Native Compilation: Compile เป็นไฟล์ชุดเดียว (Single Binary) รันได้ทุกที่โดยไม่ต้องลง Runtime
HLJS GO
// ✅ Best Practice: การจัดการไฟล์แบบปลอดภัยสไตล์ Go
func processFile(name string) error {
	f, err := os.Open(name)
	if err != nil {
		return fmt.Errorf("could not open file: %w", err) // 🛠 เผชิญหน้ากับ Error ตรงๆ
	}
	defer f.Close() // 🛠 สั่งปิดล่วงหน้า กันลืม (Cleaner Code)

	go doWork(f) // 🛠 รันงานหนักๆ เป็น Background ทันที
	return nil
}

🪤 4. The Junior Trap: โรค "Panic! ท่วมแผ่นดิน"

จูเนียร์ที่มาจากภาษาอื่นมักจะใช้ panic แทน error เมื่อขี้เกียจเช็คเงื่อนไข:

HLJS GO
// ❌ Junior Trap: สั่งปิดแอปทิ้งเมื่อเจอจุดผิดพลาดเล็กน้อย
if err != nil {
    panic(err) // 🌋 พัง! แอปทั้งระบบจะหยุดทำงานทันที แทนที่จะส่ง Error กลับไปให้ User ทราบ
}

ระวัง: panic คือทางเลือกสุดท้ายเมื่อระบบไม่สามารถรันต่อได้จริงๆ (เช่น Memory เต็ม) เท่านั้น ✅ การแก้ไข: จงส่ง error กลับขึ้นไปยัง Function Caller เพื่อให้ระบบจัดการปัญหาได้อย่างนุ่มนวลครับ


⚖️ 5. The Why Matrix: Go vs Node.js vs Java

หัวข้อGo (The Gopher)Node.js (V8)Java (The Giant)
ความเร็ว⚡⚡⚡ สูงมาก (Native)ปานกลางสูง
Concurrency🚀 ดีที่สุด (Goroutines)ปานกลาง (Event Loop)หนัก (OS Threads)
ขนาดไฟล์เล็กมาก (Single Binary)ใหญ่ (node_modules)ใหญ่ (JRE)
ความง่าย⚡⚡⚡ เรียบง่ายสุดๆง่าย🐢 ซับซ้อน

🎓 6. Senior Mindset Summary

การเป็น Senior คือการมองว่า "ความเร็วของโค้ดสำคัญ แต่ความเร็วในการทำความเข้าใจโค้ดสำคัญกว่า". Go สอนเราว่าการมีฟีเจอร์น้อยลงไม่ได้หมายความว่าทำอะไรได้น้อยลง แต่หมายความว่าเรามีสมาธิกับสิ่งที่สำคัญจริงๆ ได้มากขึ้นครับ!

Share this note

© 2026 My Notes by Seereen