แวะมาพบเพื่อน Golang Beyond Meetup 2025 @KKP

ผมได้ได้เชี่ยว 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

Ref book 100 hundred mistake in Go

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 แรกนะ

https://www.linkedin.com/pulse/spring-says-goodbye-autowired-what-use-instead-2025-meenakshi-kalia-4tmvc
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.