ผมได้ได้เชี่ยว Go นะ อาจจะผิดได้แวะมาพบน้องที่เคยทำงานด้วยกัน เลยมาพบในงาน และจดๆนิดหน่อยครับ
Common Mistakes in Go and How to Avoid Them
Speaker Bhuridech Sudsee
📌 Ignore to check if ok
- ถ้าค่ามันไม่มีใน map จริง ถ้าเราอ่านแต่ result ผลจะ mislead ทางแก้ให้มันคืนค่า ok ออกมาให้เราตรวจสอบด้วย
if v, ok := m2["Fruit"]; ok {
fmt.Println("Fruit present with value", v)
} else {
fmt.Println("Fruit absent")
}📌 Unintend shadow variable
- เราประกาศใช้ตัวแปรใหม่ := ที่ดันมีชื่อเดียวกับ Scope ภายนอก ทำให้ข้อมูลมันถูกทับ และหายไป ผิด Logic ทางแก้เชื่อข้างนอก และใ่ส = ยัดไป จะได้ไม่ต้องสร้างทับ
📌context - หัวข้อถัดไป The Art of Context: How to Use Context Properly
📌No graceful shutdown
- App ดับไปเลย งาน Data Loss ได้ ถ้าควรทำ Graceful Shutdown เพือมีจัดการ 3 ส่วน
1. กัน Request ที่จะเข้ามาเพิ่ม
2. Process Request ที่เข้ามาแล้วให้จบ ต้องรุ้ว่าปกติแล้ว 1 ทำนานเท่าไหร่
3. Clear Resource - เดี๋ยวมีเพิ่มในนี้ From Zero to Hero: Making Your App Production-Ready to Die
📌 overuser init function
- init() มัน function พิเศษ ที่ต้อง Run ก่อน Main ถ้ามี init() เยอะๆในหลายๆ Package แสดงว่ามันต้องรำเยอะ ก่อนทำงานจริงๆได้ มันจะมีปัญหากับแยกส่วน ทำ Unit Test ต้องไปใช้ท่า Integration Test
- ทางแก้ - ถ้าแก้ใช้ global variable run ก่อน init ใน test ยัดค่าลงได้ - สุดท้ายอออกแบบให้ Simple ก่อนดีสุด
📌 defer thining
- Defer run only current stack ระวังการใช้ go rountine มันทำงานแยกกันไม่สนใจ Defer
📌 Returning interface
- การคืน Interface บางทีมัน บังคับ Pattern มากไป ทำให้เรียกใช้ของที่ต้องการไม่ได้ Use Case ที่ใช้ Interface จริง ซ่อนการ implement หรือรองรับหลาย implementation
📌 Accept Struct
- จากหัวข้อที่แล้ว ให้คืนเป็น Struct เราจัดการได้มากกว่ายืดหยุ่นกว่า
📌 Sophisticated Dependency Injection ผมว่าคล้ายกับอันนี้ หัวข้อนี้นะ Dependency Injection in Golang
The Art of Context: How to Use Context Properly
Speaker Jirayut Khantavee
📌 ปัญหา เราจะรู้ได้ยังไง ว่าแต่ละ microservice / go rountine ทำงานยังได้ ตามที่เรากำหนดไหม ตัว Context จะมาช่วยตรงนี้
📌 Use Case ที่เห็นกัน
- Network - http client request
- DB Connection - ถ้าลืมมันไม่คืน Resource
- Go routine
- Long running operations
📌 ที่นี้ Context มีแนวคิดเรียบง่าย ตามนี้
- Whoever create context must cancel
- Do not context as global map - เก็บขเล็ก Request Id / Trace Id / User Info /CorreclationId
- อย่ายัด Business Data ลงไป มันเยอะ บวม
- เข้าใจ Propagation timeout down stream ให้ Timeout คลุมไปถึง Child
- WithCancel - Manual
- WithDeadline - กำหนดวันเวลาชัดเจน
- WithTimeout - กำหนด Duration - อย่าลืมปิดด้วย ctx.Done() เพื่อส่งสัญาณให้ go routine อื่นๆ
- ใน Context กำหนด constant เป็น type ใหม่เลย + Const ไม่ควรประกาศ inlinex
- ตรวจสอบ Context ก่อนมีค่าจริง
Dependency Injection in Golang
Speaker Panit Wechasil
📌 Dependency Injection - การที่เราต้องการลดความซับซ้อนของ Code ให้เอาของมาเสียได้แทน ซึ่งช่วยลด Coupling คือ ระดับความเกี่ยวข้อง หรือ พึ่งพากันของ Module ต่างๆในระบบ เพื่อ
- ทำให้ Test ง่าย
- เปลี่ยนของทดแทนได้ง่าย
📌 แต่ตัว Dependency Injection เพิ่มความซับซ้อนนะ แล้วถ้ามีหลาย Implementation มีท่าแปลกมาอีก การ maintain ยากขึ้น simplicity ลดลง

📌 รวมถึงพอมันง่ายแบบเสกมา มันมีโอกาศที่ใช้ผิดๆได้ ภาพของ Session แรกนะ

Spring แนะนำ ไปเน้นตัว Constructor Injection แทน
📌 ถ้าอยากทำ ใน Go มี lib หลายตัว Wire (Google) ปิดตัวแล้ว / golobby/container / Dig (Uber) / Fx (Uber)
แต่จะดีกว่าไหม ถ้าเราแบ่ง Dependency ให้ชัดตาม Domain จากนั้นค่อยๆทำมือ Simple (Manual Wiring ใน Main) ถ้ามันดูแลยาก ค่อยขยับไป Lib เพื่อลดความซับซ้อนที่ไม่จำเป็น
From Zero to Hero: Making Your App Production-Ready to Die
Speaker Panupak Vichaidit
📌 App Production-Ready to Die ที่สำคัญการทำ Graceful shutdown เพื่อไม่ให้งานต่อหล่นไป แล้วเกิดปัญหาตามนี้
- Is order processing in the service finished
- All task in gorountime is running finish - no zombie process
- DB Conn is close
📌 Flow Graceful shutdown

📌 Case ที่เจอจริง
- zombie process
- Error 500 Scale up / Down
📌 สาเหตุ เกิดจากการจัดลำดับ Resource ทีต้องจัดการมรดกก่อนตุยไม่ชัด Handler (Request) > DB Connect ถ้า DB ไปก่อนจะปัญหาว่า Handler ยังรับงานเข้ามาในขณะที่ส่วน DB Graceful shutdown ไปแล้ว เลยเจอ Error
📌 ทางแก้รวม Process และจัดลำดับใช้ชัดเจน

📌 จุดที่ท้าทาย และต้องตรวจสอบ Standard Lib / Database Lib / Message Queue แต่ละตัวมี Implement ต่อกัน จาก IO หรือ context ต้องเข้าใจ และดักไว้ จะได้ลดปัญหา ไม่รู้ว่าจบ แล้วทำซ้ำ
📌 การแก้ - Linter มาช่วย ตรวจสอบ Code ตาม Pattern ขององค์กร หรือ จับจาก Wait Process Status Callback
Code Demo: https://github.com/newnok6/kkp-dime-golang-meetup-2025
Building a Convolutional Neural Network (CNN) with Go and Gorgonia
Speaker Neda Perone
📌 มาแชร์กันก่อนการทำของออกมา มุมของ
- Software ต้องมี Requirement ที่ชัดเจน
- Deep Learning - Data ความยากความถูกต้อง clean และมาปรับ weight เพื่อให้ error น้อยสุด
📌 ยกตัวอย่างพวกของเดิมๆ การทำ Computer Vision อย่างจับวัตถุของของพวกรถ มันต้องมี Idea Object Detection + localization (ตำแหน่ง) แล้วที่นี่สนใจเฉพาะ Object Detection
- เมื่อก่อนจะ Lib OpenCV มาจัดการ และการ Algorithim อาทิ เช่น Laplacian Edge Detection มาหาจุดเปลี่ยนของสีในแต่ละแกน
- ตอนี้มียุคของ Deep Learning มีแนวคิด Convolutional Neural Network ที่เข้ามาช่วยให้งาน ทำอะไรที่ซับซ้อนได้มากขึ้น โดยมีของที่สนใจ
1. ภาพ / ข้อความ
2. มาใส่ Filter ลด Conv (หาจุดเด่น) + ReLU (ตัดของออก) ได้ Matrix ที่เล็กลง (Feature Map)
3. ทำซ้ำ 2 ไปเรื่อย แต่ละชั้นได้เป็น เส้น > รูปร่าง > รูปแบบ ขอบ > วัตถุ เอาพวก Classification มาตัดสินใจ

📌 ทีนี่ใน Go มีตัว Gorgonia มาทำ Deep Learning อาจจะไม่เด่นเท่า PyTorch+CUDA แต่เอามาใช้งานเล็กได้ ลองเล่น https://github.com/peyrone/go-cnn-mnist กับ Data Set ตัวเลข mnist
อ๋อ แล้วเดี๋ยว Official เค้ามีแจก Resource Slide นะ ที่ https://medium.com/kkpfg-life
Reference
Discover more from naiwaen@DebuggingSoft
Subscribe to get the latest posts sent to your email.



