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

Tooling, Testing & Deployment

Node toolchain คือชุดของเครื่องมือ — ของ Go คือ binary เดียว

หัวข้อที่มีชื่อว่า “Node toolchain คือชุดของเครื่องมือ — ของ Go คือ binary เดียว”

ในฐานะนักพัฒนา TypeScript คุณคงคุ้นเคยกับการต้องประกอบ toolchain เองจากชิ้นส่วนหลาย ๆ อัน:

  • Formatting: Prettier
  • Linting: ESLint พร้อม plugin ต่าง ๆ
  • Type-checking: tsc
  • Testing: Jest (หรือ Vitest)
  • Bundling: webpack / esbuild / Vite
  • Running: ts-node หรือ tsx
  • Dependency management: npm / yarn / pnpm

เครื่องมือแต่ละตัวมี config file ของตัวเอง มี release cycle ของตัวเอง และมี breaking change ของตัวเอง เวลา setup project ไม่น้อยเลยจึงหมดไปกับการเชื่อมเครื่องมือเหล่านี้เข้าด้วยกัน

Go รวมทุกอย่างข้างต้นไว้ใน binary เดียวชื่อ go ที่ติดตั้งมาพร้อมกับตัวภาษา:

TypeScript / Nodeเทียบเท่าใน Go
Prettiergofmt / go fmt (built-in)
ESLintgo vet + staticcheck / golangci-lint
tscgo build (type-checking เปิดตลอด)
Jest / Vitestgo test (built-in)
webpack / esbuildgo build (ได้ binary เดียวแบบ static)
ts-node / tsxgo run
npm / yarngo mod

สิ่งที่นักพัฒนา Go รักที่สุดอย่างหนึ่งคือ ไม่มี config สำหรับ style gofmt มีความเห็นเดียวเกี่ยวกับหน้าตาของโค้ด Go และนั่นคือจุดสิ้นสุดการสนทนา ไม่มี .prettierrc ไม่มี .eslintrc ไม่มีการเถียงเรื่อง tab width ใน pull request

นี่เป็นทางเลือกเชิงวัฒนธรรมที่ชุมชน Go ตั้งใจเลือก: เรื่อง style จบไปแล้ว การถกเถียงจึงโฟกัสอยู่ที่ architecture และ logic แทน

module นี้จะพาคุณไปรู้จักเครื่องมือหลักแต่ละตัวใน suite ของ Go และแมปเข้ากับสิ่งที่คุณรู้อยู่แล้ว:

  • gofmt, go vet, lint — การจัดรูปแบบและ static analysis
  • Project layout — โค้ดอยู่ที่ไหนและทำไม internal/ ถึงสำคัญ
  • Docker multi-stage builds — ส่ง Go image ขนาดเล็ก vs image ของ Node ที่มี node_modules
  • Cross-compilation — binary เดียวสำหรับทุก OS/arch โดยไม่ต้องมี runtime
  • CI กับ GitHub Actions — workflow ของ Go ที่ใช้งานได้จริง vs workflow ของ Node
TypeScript
// package.json (ส่วนหนึ่ง)
{
"scripts": {
"lint": "eslint src --ext .ts",
"format": "prettier --write src",
"test": "jest",
"build": "tsc && webpack",
"start": "ts-node src/main.ts"
},
"devDependencies": {
"eslint": "^8",
"prettier": "^3",
"jest": "^29",
"ts-jest": "^29",
"webpack": "^5",
"ts-node": "^10",
"typescript": "^5"
}
}
Go
# Makefile (wrapper สำหรับความสะดวกoptional)
# ทุกอย่างด้านล่างอยู่ใน binary "go" อยู่แล้ว
lint:
go vet ./...
staticcheck ./...
fmt:
go fmt ./...
test:
go test ./...
build:
go build -o bin/app ./cmd/app
run:
go run ./cmd/app
คำสั่ง Go ไหนเทียบเท่ากับ `ts-node src/main.ts`?
อะไรคือเทียบเท่าของ Prettier ใน Go สำหรับการจัดรูปแบบโค้ด?
คำสั่ง Go ไหนจัดการ dependencies (เหมือน npm/yarn)?
gofmt ของ Go สามารถกำหนดค่าได้ — จริงหรือเท็จ?