แนวคิดสำคัญของโครงสร้างโปรเจค 
เอกสารนี้ให้ภาพรวมอย่างละเอียดเกี่ยวกับแนวคิดสำคัญของโครงสร้างพื้นฐานสำหรับโปรเจคที่พัฒนาด้วย Go โดยเพื่อแสดงตัวอย่างการจัดระเบียบและโครงสร้างของโปรเจค โค้ดสั้นๆ ในเอกสารนี้จะถูกแทรกเป็นตัวอย่าง
โครงสร้างของโปรเจคเป็นการอ้างอิงไปยังรหัสฐานข้อมูลที่มีอยู่ที่: https://gitlab.finema.co/finema/golang-template
เรามาตรวจสอบโครงสร้างไดเรกทอรีต่อไปนี้เป็นตัวอย่าง:
├── cmd
│   └── api.go                     # จุดเข้าหลักสำหรับแอปพลิเคชัน API
├── consts
│   └── env.const.go               # ค่าคงที่สำหรับตัวแปรสภาพแวดล้อม
├── emsgs
│   └── user.error.go              # ข้อความข้อผิดพลาดสำหรับโมดูลผู้ใช้
├── helpers
│   └── string.helper.go           # ฟังก์ชันช่วยสำหรับการจัดการสตริง
├── migrations
│   └── 20220912084753_users.ts    # ไฟล์การโยกย้ายฐานข้อมูลตารางผู้ใช้
├── models
│   ├── base.model.go              # โมเดลฐานสำหรับฟิลด์ที่ใช้ร่วมกันในโมเดลฐานข้อมูล
├── modules
│   └── user
│       ├── user.controller.go     # ควบคุมการดำเนินการของโมดูลผู้ใช้
│       └── user.http.go           # เส้นทางและตัวจัดการ HTTP สำหรับโมดูลผู้ใช้
├── repo
│   └── base.repo.go               # รีพอร์ตที่ใช้ร่วมกันสำหรับการดำเนินการฐานข้อมูลทั่วไป
├── requests
│   ├── user_create.request.go     # โครงสร้างคำขอสำหรับการสร้างผู้ใช้ใหม่
├── services
│   ├── user.dto.go                # อ็อบเจกต์การถ่ายโอนข้อมูล (DTO) สำหรับโมดูลผู้ใช้
│   └── user.service.go            # เซอร์วิสสำหรับตรรกะธุรกิจโมดูลผู้ใช้
├── views
│   └── user.view.go               # วิวสำหรับการแสดงข้อมูลที่เกี่ยวข้องกับผู้ใช้
├── .env                           # ไฟล์กำหนดค่าสำหรับตัวแปรสภาพแวดล้อม
├── main.go                        # ไฟล์แอปพลิเคชันหลัก
├── go.mod                         # ไฟล์โมดูล Go
├── go.sum                         # ไฟล์ตรวจสอบสำหรับโมดูล Goคำอธิบายแพ็คเกจ 
แพ็คเกจ main 
แพ็คเกจ main รวมถึงฟังก์ชันหลักของแอปพลิเคชันและเป็นจุดเริ่มต้นของโปรแกรม
แพ็คเกจ cmd 
แพ็คเกจ cmd เก็บจุดเข้าของแอปพลิเคชันและเริ่มต้นเซิร์ฟเวอร์ API
ฟังก์ชัน APIRun() 
ฟังก์ชันนี้รับผิดชอบในการเริ่มต้นคอมโพเนนต์ที่สำคัญรวมทั้งสภาพแวดล้อม เชื่อมต่อฐานข้อมูล และเซิร์ฟเวอร์ HTTP นอกจากนี้ยังสร้างเส้นทางสำหรับโมดูลต่างๆ และเปิดใช้งานเซิร์ฟเวอร์ HTTP
แพ็คเกจ modules/user 
แพ็คเกจนี้ถูกกำหนดให้ใช้งานฟังก์ชันที่เกี่ยวกับผ
ู้ใช้ซึ่งรวมถึงตัวจัดการ HTTP และการดำเนินการของเซอร์วิส
ฟังก์ชัน NewUserHTTP(e *echo.Echo) 
ฟังก์ชันนี้ตั้งค่าเส้นทางที่เน้นผู้ใช้บนอินสแตนซ์ Echo ที่กำหนด (e) และจับคู่เส้นทางแต่ละเส้นทางกับฟังก์ชันตัวจัดการ HTTP ที่เรียกว่า UserController
โครงสร้าง UserController 
โครงสร้างนี้ระบุวิธีการจัดการคำขอ HTTP ที่เกี่ยวข้องกับผู้ใช้:
- การแบ่งหน้า: รับข้อมูลผู้ใช้ที่แบ่งหน้า
- การค้นหา: ค้นหาผู้ใช้ตาม ID
- การสร้าง: สร้างผู้ใช้ใหม่
- การอัปเดต: แก้ไขผู้ใช้ที่มีอยู่
- การลบ: ลบผู้ใช้
แพ็คเกจ services 
แพ็คเกจนี้รวมถึงการสร้างเซอร์วิสสำหรับฟังก์ชันต่างๆ ที่เกี่ยวข้องกับผู้ใช้
อินเตอร์เฟซ IUserService 
อินเตอร์เฟซ IUserService ระบุแบบแผนการใช้งานของเซอร์วิสผู้ใช้ซึ่งรวมถึงวิธีการสร้าง อัปเดต ค้นหา แบ่งหน้า และลบผู้ใช้
โครงสร้าง userService 
โครงสร้าง userService ดำเนินการที่มีตัวอย่างสำหรับการดำเนินการเกี่ยวกับผู้ใช้ เช่น การสร้างผู้ใช้ การอัปเดตผู้ใช้ การค้นหาผู้ใช้ การแบ่งหน้าผู้ใช้ และการลบผู้ใช้
แพ็คเกจ repo 
แพ็คเกจ repo จัดการการบันทึก
และการเรียกคืนข้อมูลโดยใช้ไลบรารี gorm
กระบวนการประมวลผลของโค้ด 
- ฟังก์ชัน mainในแพ็คเกจmainทำหน้าที่เป็นจุดเริ่มต้นของแอปพลิเคชัน
- ฟังก์ชันนี้เรียกใช้ฟังก์ชัน APIRunจากแพ็คเกจcmd
- ฟังก์ชัน APIRunทำหน้าที่เริ่มต้นสภาพแวดล้อมแอปพลิเคชันและเชื่อมต่อฐานข้อมูล
- ฟังก์ชันนี้สร้างเซิร์ฟเวอร์ HTTP โดยใช้ฟังก์ชัน core.NewHTTPServerโดยส่งค่าตัวเลือกของ context ที่จำเป็น เช่น ฐานข้อมูลและสภาพแวดล้อม
- ฟังก์ชัน APIRunลงทะเบียนเส้นทาง HTTP สำหรับการจัดการคำขอที่เกี่ยวข้องกับโมดูลหน้าแรกและผู้ใช้ โดยใช้ฟังก์ชันhome.NewHomeHTTPและuser.NewUserHTTPตามลำดับ
- ฟังก์ชัน NewUserHTTPภายในแพ็คเกจuserตั้งค่าเส้นทาง HTTP สำหรับการดำเนินการที่เกี่ยวข้องกับผู้ใช้และเชื่อมต่อกับตัวจัดการที่เกี่ยวข้องจากUserController
- เส้นทาง HTTP แต่ละเส้นทางในฟังก์ชัน NewUserHTTPถูกเชื่อมโยงกับเมธอดตัวจัดการที่เฉพาะเจาะจงในUserController(เช่นPagination,Find,Create,Update,Delete)
- เมื่อผู้ใช้ส่งคำขอ HTTP ไปยังหนึ่งในเส้นทางที่ลงทะเบียนแล้ว เมธอดตัวจัดการที่เฉพาะเจาะจง
ใน UserController จะถูกเรียกใช้ 9. เมื่อเรียกใช้เมธอดตัวจัดการใน UserController ทุกเมธอดจะส่งคำขอไปยังเซอร์วิสผู้ใช้เพื่อดำเนินการเพิ่มเติม 10. เมธอดในเซอร์วิสผู้ใช้ (Create, Update, Find, Pagination, Delete) ร่วมมือกับรีพอร์ตที่จัดการการกระทำ CRUD กับข้อมูลผู้ใช้ในฐานข้อมูล 11. เมธอดในรีพอร์ตใช้การเชื่อมต่อฐานข้อมูลเพื่อดำเนินการคิวรี SQL ที่จำเป็นและส่งผลลัพธ์กลับไปยังเซอร์วิสผู้ใช้ 12. เมธอดในเซอร์วิสผู้ใช้ประมวลผลข้อมูลที่ได้รับจากรีพอร์ตและส่งข้อมูลที่เกี่ยวข้องกลับไปยังเมธอดตัวจัดการใน UserController 13. เมธอดตัวจัดการใน UserController จัดรูปแบบข้อมูลที่ได้รับเป็น JSON และส่งกลับเป็นตอบสนอง HTTP ให้กับผู้ใช้
นี้เป็นภาพรวมระดับสูงของกระบวนการประมวลผลโค้ดภายในโครงสร้างของโค้ดที่ให้มา
สรุป 
โครงสร้างนี้เป็นการติดตามแนวทางเชิงชั้นโดยแยกความสำคัญออกเป็นแพ็คเกจที่แตกต่างกัน แพ็คเกจ cmd รับผิดชอบต่อจุดเริ่มต้นของแอปพลิเคชัน ในขณะที่แพ็คเกจ user ให้ความสำคัญกับฟังก์ชันที่เกี่ยวข้องกับผู้ใช้ แพ็คเกจ services ให้ตรรกะธุรกิ
จสำหรับการดำเนินงานเกี่ยวกับผู้ใช้ และแพ็คเกจ repo จัดการการบันทึกและการเรียกคืนข้อมูล
โดยปฏิบัติตามโครงสร้างนี้ โค้ดเบสจะเรียบร้อยและมีโมดูลที่สามารถขยายได้ง่ายในอนาคตและสะดวกในการบำรุงรักษา