Go คืออะไร ทำไมทีมยุคใหม่เลือกใช้



Go (หรือ Golang เวลาค้นหา) ออกแบบที่ Google โดย Rob Pike, Ken Thompson (คนสร้าง Unix/C) และ Robert Griesemer เปิดตัวปี 2009 เป้าหมายคือแก้ความเจ็บปวดของการเขียนซอฟต์แวร์ขนาดใหญ่: คอมไพล์ช้า, dependency ยุ่ง, concurrency ยาก, โค้ดอ่านยาก

Go อยู่ตรงไหน

  • Cloud infrastructure — Docker, Kubernetes, Terraform, Prometheus, etcd ทั้งหมดเขียนด้วย Go
  • Backend / API / microservices — บริษัทอย่าง Uber, Twitch, Cloudflare, Dropbox, PayPal
  • CLI toolsgh (GitHub CLI), hugo, kubectl
  • Network services — proxy, load balancer, message queue

Go เด่นในงาน “เซิร์ฟเวอร์ที่ต้องรับ request จำนวนมากพร้อมกัน” และ “เครื่องมือ CLI ที่ deploy ง่าย”

จุดขายของ Go

1. คอมไพล์เร็วมาก + binary เดี่ยว

go build -o myapp
./myapp              # ไฟล์เดียว ไม่ต้องมี runtime, ไม่ต้องมี dependency บนเครื่องปลายทาง

โปรเจกต์ใหญ่คอมไพล์ในไม่กี่วินาที (เทียบ C++ ที่เป็นนาที) — ผลลัพธ์เป็น executable ตัวเดียว copy ไปวางบนเซิร์ฟเวอร์แล้วรันได้เลย ไม่ต้องลง Python/Java/Node

cross-compile ง่าย:

GOOS=linux GOARCH=arm64 go build     # สร้าง binary สำหรับ Linux ARM จากเครื่อง Mac

2. concurrency อยู่ในภาษา

go doSomething()      // รัน doSomething เป็น goroutine — พร้อมกันกับโค้ดถัดไป

goroutine เบากว่า OS thread หลายเท่า — รันเป็นแสนตัวพร้อมกันได้ channel ใช้สื่อสารระหว่าง goroutine อย่างปลอดภัย

ch := make(chan string)
go func() { ch <- "เสร็จแล้ว" }()
msg := <-ch           // รอรับค่าจาก goroutine

นี่คือสิ่งที่ทำให้ Go เหมาะกับเซิร์ฟเวอร์ — จัดการ 10,000 connection พร้อมกันด้วยโค้ดที่อ่านเหมือน synchronous

3. ภาษาเล็ก เรียนจบเร็ว

Go มี keyword แค่ 25 คำ (C มี ~35, Java ~50) ไม่มี class, ไม่มี inheritance, ไม่มี exception, ไม่มี generics จนถึง 1.18, ไม่มี ternary operator ตั้งใจให้ “มีวิธีเดียวในการทำสิ่งหนึ่ง” — โค้ดของทุกคนหน้าตาคล้ายกัน อ่านง่าย

package main

import "fmt"

func main() {
    fmt.Println("สวัสดีจาก Go")
}

4. เครื่องมือมาในกล่อง

  • go fmt — จัดรูปแบบโค้ดอัตโนมัติ (ทุกคนใช้ style เดียวกัน ไม่มีการเถียง)
  • go test — ทดสอบ + coverage + benchmark + fuzzing
  • go vet — หาบั๊กที่พบบ่อย
  • go build -race — จับ data race
  • go mod — จัดการ dependency
  • go doc — เอกสาร

ไม่ต้องเลือก build tool / test framework / formatter — มีให้หมด

5. garbage collector

ต่างจาก C — Go จัดการหน่วยความจำให้ ไม่มี malloc/free, ไม่มี segfault จากการลืม (แทบจะ) GC ของ Go ปรับจูนมาให้ pause สั้นมาก (< 1ms) เหมาะกับ latency-sensitive service

Go เทียบภาษาอื่น

GoPythonJavaC
ความเร็วเร็ว (compiled)ช้าเร็วเร็วที่สุด
deploybinary เดี่ยวต้องมี interpreterต้องมี JVMbinary (ผูก OS)
concurrencygoroutine/channel ในภาษาGIL จำกัด, async ยุ่งthread หนักpthread ด้วยมือ
memoryGCGCGCด้วยมือ
เรียนยากไหมง่าย (ภาษาเล็ก)ง่ายปานกลางยาก
เหมาะกับเซิร์ฟเวอร์, CLI, infradata, script, AIenterprisesystems, embedded

สิ่งที่ Go จงใจไม่มี (และคนบ่น)

  • ไม่มี exception — ใช้ return err แทน (verbose แต่ชัดเจน)
  • generics มาช้า (1.18, 2022) และยังจำกัด
  • error handling ซ้ำ ๆif err != nil { return err } เยอะ
  • ไม่มี enum แท้ — ใช้ const + iota
  • interface{} / any สมัยก่อนใช้เยอะจน type safety หลุด

ทีมออกแบบยอมรับ trade-off เหล่านี้เพื่อความเรียบง่ายและความสม่ำเสมอ

เรื่องที่คนมักพลาด

  • คาดหวังว่า Go มี class/inheritance — ไม่มี ใช้ struct + interface + composition แทน (เฟส 3)
  • คิดว่า goroutine = thread — เบากว่ามาก, Go scheduler จัดการเอง สร้างเป็นแสนตัวได้
  • คิดว่า Go ช้าเพราะมี GC — เร็วพอสำหรับงานเซิร์ฟเวอร์ส่วนใหญ่ GC pause < 1ms
  • มองว่า if err != nil ที่เยอะคือข้อเสีย — มันคือ feature: ทุก error ถูกจัดการอย่างชัดเจน ไม่มี “throw แล้วลืม catch”
  • คิดว่า Go เหมาะกับทุกงาน — ไม่เหมาะกับ data science/ML (ใช้ Python), งาน GUI, หรือ scripting เล็ก ๆ

สรุป

  • Go = ภาษา compiled จาก Google เน้นความเรียบง่าย, คอมไพล์เร็ว, binary เดี่ยว, concurrency ในภาษา
  • เหมาะกับ: backend/API, microservices, CLI tools, cloud infrastructure
  • keyword แค่ 25 คำ, ไม่มี class/exception/inheritance — เรียนจบพื้นฐานได้ใน 1 สัปดาห์
  • เครื่องมือครบในกล่อง: go fmt / go test / go vet / go mod / race detector
  • trade-off ที่ต้องรับ: error handling verbose, generics จำกัด, ไม่มี enum แท้

บทถัดไปเราจะติดตั้ง Go toolchain, รันโปรแกรมแรกด้วย go run, สร้าง module ด้วย go mod init และรู้จัก go fmt / go vet