The Go Toolchain
คำสั่ง go คือมีดพับสวิส
หัวข้อที่มีชื่อว่า “คำสั่ง go คือมีดพับสวิส”binary go รวมทุกเครื่องมือที่นักพัฒนา Go ต้องการไว้ใน executable เดียว ไม่มี build system แยกต่างหาก ไม่ต้องใช้ Makefile สำหรับ workflow พื้นฐาน และไม่มี plugin ecosystem ที่ต้องตั้งค่า คำสั่งต่อไปนี้ครอบคลุม 90% ของการพัฒนา Go ประจำวัน
go run — compile และ execute ในขั้นตอนเดียว
หัวข้อที่มีชื่อว่า “go run — compile และ execute ในขั้นตอนเดียว”go run compile ไฟล์ที่ระบุและรัน binary ที่ได้ทันที เหมาะสำหรับ scripts และการทดสอบรวดเร็ว — ไม่มีไฟล์ output เหลือบน disk
go run main.gogo run . # รัน package ใน directory ปัจจุบันgo run ./cmd/server # รัน cmd sub-package เฉพาะgo build — สร้าง binary
หัวข้อที่มีชื่อว่า “go build — สร้าง binary”go build compile package และเขียน binary ลง disk โดยไม่มี flag -o binary จะตั้งชื่อตาม module ใน directory ปัจจุบัน
go build . # build package ปัจจุบัน output: ./myappgo build -o bin/server ./cmd/server # build ไปยัง path เฉพาะ
# Cross-compile สำหรับ Linux/amd64 จาก macOSCGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w" -o bin/server ./cmd/serverflag -ldflags="-s -w" ลบ symbol table และ DWARF debug info ออก ลดขนาด binary อย่างมีนัยสำคัญ CGO_ENABLED=0 รับประกัน binary ที่ static อย่างสมบูรณ์ — ไม่มี dynamic libc dependency
go fmt — จัดรูปแบบ canonical
หัวข้อที่มีชื่อว่า “go fmt — จัดรูปแบบ canonical”go fmt รัน gofmt กับไฟล์ .go ทั้งหมดใน package และเขียนผลลัพธ์กลับลง disk มีวิธีเดียวเท่านั้นในการจัดรูปแบบโค้ด Go
go fmt ./... # จัดรูปแบบทุก package ใน modulegofmt -w -l ./ # เทียบเท่า: เขียนการเปลี่ยนแปลง, แสดงไฟล์ที่แก้ไขใน CI ตรวจสอบว่าโค้ดถูกจัดรูปแบบแล้ว:
gofmt -l . | grep -q . && echo "unformatted files found" && exit 1 || echo "all formatted"go vet — static analysis
หัวข้อที่มีชื่อว่า “go vet — static analysis”go vet รัน static analysers ชุดหนึ่งที่ตรวจจับ bugs ที่ compiler ไม่ตรวจ: format verbs ของ Printf ที่ไม่ตรงกัน, unreachable code, การใช้ mutex ที่ผิด และอื่นๆ
go vet ./...ตัวอย่าง issues ที่ go vet ตรวจพบ:
fmt.Printf("%d", "hello") // vet: format %d has arg "hello" of wrong type stringvar mu sync.Mutexmu2 := mu // vet: assignment copies lock valuego vet exit ด้วย non-zero status หากพบปัญหา ทำให้ fail CI pipeline ได้ง่าย
go doc — เรียกดู documentation
หัวข้อที่มีชื่อว่า “go doc — เรียกดู documentation”go doc แสดง documentation สำหรับ package, type, function, หรือ method ใดก็ได้ — โดยไม่ต้องออกจาก terminal
go doc fmt # ภาพรวม packagego doc fmt.Println # ฟังก์ชันเฉพาะgo doc net/http.Request # type ใน sub-packagego doc -all net/http # ทุก exported symbol ใน packageสำหรับประสบการณ์แบบ browser ที่สมบูรณ์กว่า ใช้ pkgsite หรือเรียกดูที่ pkg.go.dev
รวมทุกอย่าง — CI pipeline ทั่วไป
หัวข้อที่มีชื่อว่า “รวมทุกอย่าง — CI pipeline ทั่วไป”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
ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| Tool | Benefit | Cost |
|---|---|---|
go vet | ตรวจหา common mistakes ก่อน runtime | ไม่ครอบคลุม semantic bug ทั้งหมด — ต้องใช้ staticcheck เพิ่ม |
go build -race | ตรวจหา race condition ใน binary | binary ช้าลง 2-10x — ไม่เหมาะ production build |
gofmt (ผ่าน go fmt) | ไม่มีถกเถียงเรื่อง formatting, consistent ทั้ง ecosystem | ไม่มี config — ต้องยอมรับ canonical style |
go doc | documentation ใน terminal ไม่ต้องออก browser | ไม่มี search full-text — ต้องรู้ชื่อ package/function แล้ว |
ความเข้าใจผิดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ความเข้าใจผิดที่พบบ่อย”go fmtเป็นแค่ style เท่านั้น — gofmt เป็น de facto standard — PR ที่ไม่ผ่าน gofmt ถูก reject ใน project หลักทุกที่go vetตรวจสอบครบทุก bug —go vetตรวจ subset ของ common mistakes — ใช้ staticcheck เพิ่มสำหรับ production codebasego generateทำงานอัตโนมัติตอน build —go 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 เป็น standardGo standard library enforce gofmt ใน code review — ไม่มีข้อยกเว้น
Docker ใช้
go tool pprofเพื่อ profile container daemon memory usage และ optimize hot path