เรียน Go ภาษาง่าย 📘

📦

เจาะลึก Modules + Toolchain: go fix vet doc ฉบับภาษาง่าย

go.mod, tidy, vet, fix, workspace

7 บท
10 ข้อสอบ
1. go.mod บัตรประชาชนโปรเจกต์
bash
go mod init myapp
cat go.mod

ลง Go 1.27 แต่เห็น go 1.25? ปกติ Go ตั้งใจให้เลขต่ำไว้ก่อนเพื่อให้เพื่อนเปิดได้ ไม่ต้องแก้ อยากขยับค่อย:

bash
go get go@1.27

โครงง่ายๆ พอ:

code
myapp/
  go.mod
  main.go
  handler/user.go
  store/user.go

1 โฟลเดอร์ = 1 package ชื่อสั้นตัวเล็ก

✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


2. go get tidy vendor + work
bash
go get github.com/fatih/color       # ยืมของ
go get github.com/fatih/color@v1.18 # ล็อกเวอร์ชัน
go mod tidy   # เก็บกวาด (1.27 รวม require เหลือ 2 ก้อน direct/indirect เอง)
go mod vendor # ก็อปของมาไว้ในโปรเจกต์ (เหมาะกับเน็ตบริษัทช้า/ห้ามออกเน็ต)
go work init ./api ./web # มีหลาย module อยากแก้พร้อมกันใช้ workspace

go.sum = ใบเสร็จกันของปลอม อย่าลบมั่ว

✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


3. go fmt vet fix doc 4 ทหารเสือ
bash
go fmt ./...  # แม่บ้านจัดหน้า
go vet ./...  # หมอตรวจ (print ผิด, %w ผิด, atomic ผิด)
go fix ./...  # ครูแก้โค้ดเก่าเป็นแบบใหม่ (1.26 รื้อใหม่ เก่งมาก)
go doc fmt.Println
go doc example.com/pkg@v1.2.3  # ใหม่ 1.27: ดูของเวอร์ชันนั้นได้เลย

ใช้ทุกวันก่อน git push:

bash
go fmt ./... && go vet ./... && go test ./...
✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


4. modernizers ใหม่ 1.26-1.27

go fix ตอนนี้มีตัวช่วยชื่อ modernizers (รันแล้วถามก่อนแก้ ไม่แก้เงียบ):

  • atomictypes — เปลี่ยน atomic.AddInt64(&x) เก่าเป็น atomic.Int64 ใหม่อ่านง่าย
  • embedlit — เปลี่ยน struct ฝังแบบห่อยาวเป็นแบบสั้น 1.27 Gopher{Burrow: ...}
  • slicesbackward — เปลี่ยน loop ถอยหลังมือเขียนเป็น slices.Backward ที่ถูกกว่า
  • unsafefuncs — เตือนจุดใช้ unsafe เสี่ยงพัง
  • inline — พยายาม inline func เล็กๆ ที่มี //go:fix inline
bash
go fix ./...
✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


5. GODEBUG + GOEXPERIMENT เอาไว้ไล่บั๊ก

ของใหม่ 1.26-1.27 ที่ต้องรู้ชื่อ (เอาไว้ปิดของใหม่ชั่วคราวตอนไล่บั๊ก):

code
GODEBUG=tlssecpmlkem=0    # ปิด TLS hybrid กันควอนตัม กลับแบบเก่า (เจอ server เก่า)
GODEBUG=urlstrictcolons=0 # กลับไป parse URL แบบหยวนๆ (1.26 เข้มขึ้น)
GODEBUG=gctrace=1         # ดู GC ทำงาน (Green Tea 1.26 หยุดสั้นลง)
GOEXPERIMENT=norandomizedheapbase64 # ปิดสุ่ม heap (สาย cgo เท่านั้น)

เช็ก env:

bash
go env GOVERSION GOROOT GOPATH GOCACHE GOEXPERIMENT

อ้างอิง: Go 1.26 blog (go fix rewrite), Go 1.27 blog (new modernizers, doc@version, tidy), Release History 1.27.1

✏️ แบบทดสอบท้ายบท
แบบทดสอบท้ายบท
0/2


ภาคผนวก: ตัวอย่างเพิ่ม + Best Practices
ตัวอย่างเพิ่ม 1: ใช้ lib ในเครื่องด้วย replace (ตอน dev)
bash
go mod edit -replace example.com/lib=../lib
go mod tidy
ตัวอย่างเพิ่ม 2: workspace รันหลาย service พร้อมกัน
bash
go work init ./api ./lib
go work use ./worker
go run ./api
ตัวอย่างเพิ่ม 3: เช็กความเรียบร้อยก่อน push
bash
go mod verify
go list -m all
GOTOOLCHAIN=go1.27.1 go version
Best practices เช็กลิสต์
  • ชื่อ module = ที่อยู่ repo จริง (github.com/ทีม/โปรเจกต์) ย้ายทีหลังปวดหัว
  • go mod tidy ทุกครั้งก่อน commit + ส่ง go.sum ขึ้น git ด้วย
  • ใช้ replace แค่ตอน dev อย่าลืมเอาออกก่อน release
  • ตั้ง GOTOOLCHAIN ให้ทีมใช้เวอร์ชันเดียวกัน
  • go vet ./... + go fix ./... ก่อน push ทุกครั้ง
  • vendor เฉพาะเมื่อต้อง build แบบ offline จริงๆ
แบบฝึกหัด
  • แยกโค้ดตัวเองเป็น 2 modules + ใช้ replace เรียกหากัน
  • ตั้ง workspace รัน 2 services พร้อมกันในเครื่องเดียว