Review checklist
นี่คือ checklist ที่ไล่ดูด้วยตา บน diff ไหนก็ได้ ของคุณเองหรือของ AI หลังจากเครื่องมือใน Verification Tools รันผ่านและสะอาดแล้ว หน้านี้ตั้งใจให้พอดี 1 หน้าเวลาพิมพ์ — checklist ที่ไม่มีใครเปิดดูจริงตอน review ก็ไร้ค่า ทุกบรรทัด link ไปบทที่อธิบายว่า ทำไม เพื่อให้หน้านี้ยังคงเป็นแค่ list ไม่ใช่การสอนซ้ำ
- ทุก
errorreturn ถูกเช็กก่อนใช้ค่าที่อยู่ข้างๆ มันหรือเปล่า? - มี
errorไหนถูกจัดการสองรอบ — ทั้ง log และ return ขึ้นไปด้วยหรือเปล่า? ดู Error Values - มี
:=ในif/forที่บังเอิญ shadowerrด้านนอกไหม? ดู Variables & Types - concrete error type ถูก assign ให้ตัวแปรชนิด
errorแล้ว return ไปตรงๆ โดยไม่ตรวจสอบไหม? ดู A nil pointer inside an interface is not nil - ทุก
errors.Ascall ส่ง pointer (&target) ไม่ใช่ target เฉยๆ หรือเปล่า? ดู Wrapping Errors recover()ถูกเรียกตรงภายใน deferred function เอง — ไม่ใช่ผ่าน helper อีกชั้นหนึ่งใช่ไหม? ดู Panic and Recover- มี package นอก
mainตัวไหนเรียกlog.Fatalหรือos.Exitทำให้deferของ caller ถูกข้ามไปไหม? ดู Panic and Recover
Concurrency
หัวข้อที่มีชื่อว่า “Concurrency”- ทุก goroutine มี exit condition ที่มองเห็นได้ไหม — channel ที่ปิดแล้ว,
ctxที่ cancel แล้ว, หรือค่าที่มันรออยู่? ดู Goroutines wg.Addถูกเรียกก่อน goroutine เริ่ม จาก goroutine เดียวกับที่จะเรียกwg.Waitหรือเปล่า? ดู Goroutines- ทุก goroutine ที่ panic ได้ recover จากภายในตัวมันเองหรือเปล่า? ดู Panic and Recover
- มี type ที่มี
sync.Mutex(หรือคล้ายกัน) ตัวไหนถูกใช้หรือส่งต่อแบบ value ไหม? ดู The sync package - ถ้า loop launch goroutine หรือ defer closure,
godirective ในgo.modรับประกัน per-iteration variable จริงหรือเปล่า (1.22+) หรือ loop variable ถูก capture ไว้อย่างชัดเจนแล้ว? ดู Functions breakเปล่าๆ ในselectในforไปถึง loop ที่มันดูเหมือนจะเล็งไปจริงหรือเปล่า? ดู Control Flow- background work ใช้
context.Contextของ request ซ้ำทั้งที่ควรตัดด้วยcontext.WithoutCancelหรือถูกเก็บไว้ใน struct field หรือเปล่า? ดู Context
Resources
หัวข้อที่มีชื่อว่า “Resources”- ทุก
deferที่ close/unlock/release อะไรบางอย่าง ผูก scope กับการ acquire ครั้งเดียว ไม่ใช่สะสมข้าม loop ใช่ไหม? ดู io and bufio - resource (
resp.Body, ไฟล์, lock) ถูกใช้หลังจากเช็ก error ตอน acquire แล้วเท่านั้นใช่ไหม? ดู The client side - ทุก
http.Clientที่ใช้นอกเหนือจาก script เร็วๆ ตั้งTimeoutหรือเปล่า? ดู The client side
API contract
หัวข้อที่มีชื่อว่า “API contract”resp.StatusCodeถูกเช็กก่อนเชื่อ response body ว่าเป็นข้อมูลจริงไหม? ดู The client sideomitemptyอยู่บนtime.Timeหรือ struct field ที่คาดหวังให้มัน omit zero value ไหม? ดู encoding/json- ทุก field ที่ JSON contract ต้องการถูก export (และ tag) จริงไหม? ดู encoding/json
- nil slice ถูก return ในจุดที่ contract ต้องการ
[]หรือกลับกันไหม? ดู encoding/json
appendบน sub-slice เสี่ยงทับ backing array ของ parent slice ไหม? ดู Slices- map ถูกเขียนก่อนที่จะ initialize ด้วย
makeหรือ literal หรือเปล่า? ดู Maps - มี call site ไหนยังสมมติว่า
maps.Keys/maps.Valuesคืน slice แทนที่จะเป็นiter.Seqไหม? ดู Iterators
Tooling & style
หัวข้อที่มีชื่อว่า “Tooling & style”time.Sleep/duration literal ทุกตัวระบุ unit ชัดเจนไหม (5 * time.Secondไม่ใช่5เปล่าๆ)? ดู time- interface ใหม่มี implementation จริงมากกว่าหนึ่งตัวไหม — หรือ
any/concrete type จะง่ายกว่า?interface{}ถูกใช้ในจุดที่anyอ่านง่ายกว่าไหม? receiver ตั้งชื่อตาม type ไม่ใช่this/selfใช่ไหม? ดู Interfaces และ Methods