ข้ามไปยังเนื้อหา

Go ที่ไม่มีใน TypeScript

TypeScript เป็น layer ที่วางซ้อนบน JavaScript รันบน runtime ที่มี garbage collector (V8 หรือ Deno) และทุก object เป็น reference โดยอัตโนมัติ ส่วน Go ออกแบบมาจากศูนย์ให้เป็นภาษา compiled, statically typed ที่ทำงานระดับ system ได้ รากฐานที่ต่างกันนี้ทำให้ Go มีฟีเจอร์ทั้งหมวดที่ TypeScript ไม่มี ไม่ใช่เพราะ TS ลืม แต่เพราะโมเดลเบื้องล่างต่างกัน

Module นี้ครอบคลุมฟีเจอร์เหล่านั้น เรียนไปทีละบทเพื่อสร้าง intuition กับส่วนของ Go ที่จะรู้สึกแปลกที่สุดในตอนแรก แต่ทรงพลังที่สุดเมื่อเข้าใจแล้ว

บทเรียนคอนเซปต์ Go-only
Pointers& / * — memory address แบบชัดเจน
Value vs ReferenceStruct และ array คัดลอก; slice และ map แชร์ข้อมูล
Defer / Panic / Recovercleanup แบบ deterministic และ panic handling
Struct EmbeddingComposition โดยไม่ต้องใช้ class inheritance
Goroutines PreviewLightweight thread — ไม่ใช่ async/await
Static Binaries & ToolchainBinary เดียว, ไม่ต้องการ runtime, cross-compile ได้เร็ว
Generics DifferencesType parameter พร้อม interface constraint — ไม่ใช่ structural

ทุกฟีเจอร์มีแรงจูงใจเดียวกัน คือ ความชัดเจนและคาดเดาได้ในราคาถูก Go เลือกทำให้ side-effect มองเห็นได้ (ใครเป็นเจ้าของ memory นี้? function นี้รับ copy หรือแชร์ข้อมูลเดิม?) มากกว่าความสะดวกแบบ implicit ที่ JavaScript/TypeScript ให้ การแลกนี้ทำให้เจอบั๊กแปลก ๆ บน production น้อยลง แต่แลกกับการคิดเผื่อมากขึ้นนิดหน่อยตั้งแต่ต้น

TypeScript
// TypeScript ไม่มี pointer, value-copy semantics แบบชัดเจน,
// keyword defer, struct embedding, goroutine,
// หรือแนวคิด "compile เป็น static binary"
// สิ่งเหล่านี้เป็นของ Go โดยเฉพาะ
Go
// Go — ชิมรสแต่ละคอนเซปต์ใน module นี้
package main
import "fmt"
type Logger struct{ prefix string }
func (l Logger) Log(msg string) { fmt.Println(l.prefix+":", msg) }
type Service struct {
Logger // embedded — ไม่ต้องมี inheritance
name string
}
func riskyOp() (err error) {
defer func() { // defer: รันเสมอเมื่อออกจาก function
if r := recover(); r != nil {
err = fmt.Errorf("recovered: %v", r)
}
}()
panic("something went wrong")
}
func double[T int | float64](v T) T { return v * 2 } // generics
func main() {
svc := Service{Logger: Logger{prefix: "SVC"}, name: "demo"}
svc.Log("starting") // method ที่ promote มาจาก Logger
x := 10
p := &x // pointer ไปยัง x
*p = 99 // แก้ไขผ่าน pointer
fmt.Println("x via pointer:", x)
err := riskyOp()
fmt.Println("riskyOp err:", err)
fmt.Println("double 7:", double(7))
}
ข้อใดต่อไปนี้เป็นคอนเซปต์ Go ที่ไม่มีเทียบเท่าตรงๆ ใน TypeScript?
ทำไม Go ถึงใช้ pointer แทนการส่ง reference เสมอ?
ฟีเจอร์ Go อะไรที่แทน try/finally cleanup block ที่ยืดยาว?