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

The Go Toolchain

binary go รวมทุกเครื่องมือที่นักพัฒนา Go ต้องการไว้ใน executable เดียว ไม่มี build system แยกต่างหาก ไม่ต้องใช้ Makefile สำหรับ workflow พื้นฐาน และไม่มี plugin ecosystem ที่ต้องตั้งค่า คำสั่งต่อไปนี้ครอบคลุม 90% ของการพัฒนา Go ประจำวัน

go run compile ไฟล์ที่ระบุและรัน binary ที่ได้ทันที เหมาะสำหรับ scripts และการทดสอบรวดเร็ว — ไม่มีไฟล์ output เหลือบน disk

Terminal window
go run main.go
go run . # รัน package ใน directory ปัจจุบัน
go run ./cmd/server # รัน cmd sub-package เฉพาะ

go build compile package และเขียน binary ลง disk โดยไม่มี flag -o binary จะตั้งชื่อตาม module ใน directory ปัจจุบัน

Terminal window
go build . # build package ปัจจุบัน output: ./myapp
go build -o bin/server ./cmd/server # build ไปยัง path เฉพาะ
# Cross-compile สำหรับ Linux/amd64 จาก macOS
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o bin/server ./cmd/server

flag -ldflags="-s -w" ลบ symbol table และ DWARF debug info ออก ลดขนาด binary อย่างมีนัยสำคัญ CGO_ENABLED=0 รับประกัน binary ที่ static อย่างสมบูรณ์ — ไม่มี dynamic libc dependency

go fmt รัน gofmt กับไฟล์ .go ทั้งหมดใน package และเขียนผลลัพธ์กลับลง disk มีวิธีเดียวเท่านั้นในการจัดรูปแบบโค้ด Go

Terminal window
go fmt ./... # จัดรูปแบบทุก package ใน module
gofmt -w -l ./ # เทียบเท่า: เขียนการเปลี่ยนแปลง, แสดงไฟล์ที่แก้ไข

ใน CI ตรวจสอบว่าโค้ดถูกจัดรูปแบบแล้ว:

Terminal window
gofmt -l . | grep -q . && echo "unformatted files found" && exit 1 || echo "all formatted"

go vet รัน static analysers ชุดหนึ่งที่ตรวจจับ bugs ที่ compiler ไม่ตรวจ: format verbs ของ Printf ที่ไม่ตรงกัน, unreachable code, การใช้ mutex ที่ผิด และอื่นๆ

Terminal window
go vet ./...

ตัวอย่าง issues ที่ go vet ตรวจพบ:

fmt.Printf("%d", "hello") // vet: format %d has arg "hello" of wrong type string
var mu sync.Mutex
mu2 := mu // vet: assignment copies lock value

go vet exit ด้วย non-zero status หากพบปัญหา ทำให้ fail CI pipeline ได้ง่าย

go doc แสดง documentation สำหรับ package, type, function, หรือ method ใดก็ได้ — โดยไม่ต้องออกจาก terminal

Terminal window
go doc fmt # ภาพรวม package
go doc fmt.Println # ฟังก์ชันเฉพาะ
go doc net/http.Request # type ใน sub-package
go doc -all net/http # ทุก exported symbol ใน package

สำหรับประสบการณ์แบบ browser ที่สมบูรณ์กว่า ใช้ pkgsite หรือเรียกดูที่ pkg.go.dev

Terminal window
go fmt ./... && \
go vet ./... && \
go test -race -coverprofile=coverage.out -covermode=atomic ./... && \
go build ./...

pipeline สี่คำสั่งนี้ตรวจจับ formatting drift, static bugs, data races, และ compilation errors ก่อนที่ code จะถูก merge

ToolBenefitCost
go vetตรวจหา common mistakes ก่อน runtimeไม่ครอบคลุม semantic bug ทั้งหมด — ต้องใช้ staticcheck เพิ่ม
go build -raceตรวจหา race condition ใน binarybinary ช้าลง 2-10x — ไม่เหมาะ production build
gofmt (ผ่าน go fmt)ไม่มีถกเถียงเรื่อง formatting, consistent ทั้ง ecosystemไม่มี config — ต้องยอมรับ canonical style
go docdocumentation ใน terminal ไม่ต้องออก browserไม่มี search full-text — ต้องรู้ชื่อ package/function แล้ว
  • go fmt เป็นแค่ style เท่านั้น — gofmt เป็น de facto standard — PR ที่ไม่ผ่าน gofmt ถูก reject ใน project หลักทุกที่
  • go vet ตรวจสอบครบทุก buggo vet ตรวจ subset ของ common mistakes — ใช้ staticcheck เพิ่มสำหรับ production codebase
  • go generate ทำงานอัตโนมัติตอน buildgo generate ต้องรันเอง ไม่ได้รันตอน go build — ต้อง explicit ใน Makefile หรือ CI
  • GOPATH ยังจำเป็น — Go modules (go.mod) แทน GOPATH อย่างสมบูรณ์ตั้งแต่ Go 1.16

💡 ตัวอย่างจากของจริง

Kubernetes CI pipeline รัน go vet + staticcheck + race detector ทุก PR — ตรวจจับ bug ก่อน merge เป็น standard

Go standard library enforce gofmt ใน code review — ไม่มีข้อยกเว้น

Docker ใช้ go tool pprof เพื่อ profile container daemon memory usage และ optimize hot path

ความแตกต่างระหว่าง go run และ go build คืออะไร?
ควรรวม flags ใดกับ go build เมื่อ cross-compile static Linux binary?
go vet ตรวจจับ issues ประเภทใดที่ compiler ไม่ตรวจ?
คำสั่งใดแสดง documentation สำหรับ fmt.Println ใน terminal?