การสร้างแพ็คเกจ ภาษา Go
บทความนี้กล่าวถึง การสร้างแพ็คเกจ ภาษา Go ในระบบบการจัดการหลังบ้าน Go Admin ด้วยเว็บแอพพลิเคชั่น โดยใช้ฐานข้อมูล MySQL ร่วมกับตัวช่วยในการจัดการเขียนโค้ดกับฐานข้อมูลคือ GORM และใช้ เว็บเฟรมเวิร์ค Go Fiber ช่วยเหลือในการสร้าง เว็บแอพพลิเคชั่น
ข้อกำหนดเบื้องต้น
ข้อกำหนดสำหรับบทความนี้คือ คุณควรได้ทำตามบทความ การใช้ GORM กับ MySQL มาก่อน
สร้างโปรเจค go-admin
สร้าง Database ใหม่ ชื่อ go_admin และสร้างโปรเจคใหม่ชื่อ go-admin
สร้างไฟล์ go.mod
สร้างไฟล์ go.mod ภายในโฟลเดอร์โมดูล go-admin โดย Go Modules ที่เปิดตัวใน Go 1.11 มีเป้าหมายเพื่อแทนที่ Go Workspaces และ GOPATH การสร้างและเรียกใช้งานคำสั่ง เพื่อสร้างไฟล์ go.mod คือสิ่งที่สร้างขึ้นมาเพื่อจัดการ packages ต่างๆ สามารถกำหนดเวอร์ชั่นได้และมีการจัดการที่มีประสิทธิภาพมากขึ้นนั้นเอง และถ้าไม่มีไฟล์ go.mod จะไม่สามารถใช้คำสั่ง go build คอมไพล์ไฟล์ซอร์สโค้ดของเราได้
go mod init go-admin
ติดตั้ง gorm.io/gorm
เราจะใช้ ORM ( Object-Relational-Mapping ) เพื่อทำให้การโต้ตอบกับฐานข้อมูลง่ายขึ้น หากคุณเลือกที่จะทำงานกับฐานข้อมูลโดยตรง คุณจะต้องเขียน Query เพื่อดำเนินการกับฐานข้อมูล แต่ ORM ทำให้ง่ายขึ้นโดยดูแลการแปลงคำขอของเราเป็นการสืบค้นและให้ API อย่างง่ายสำหรับเราในการอ่าน เขียนข้อมูลไปยังฐานข้อมูล
go get -u gorm.io/gorm
ติดตั้ง gorm.io/driver/mysql
เมื่อเราสร้าง Database ด้วย MySQL การเขียนโค้ด GO เชื่อมไปยัง MySQL โดยใช้ Library ของ GO ชื่อว่า go-sql-driver/mysql
go get gorm.io/driver/mysql
ติดตั้ง github.com/gofiber/fiber/v2
เว็บเฟรมเวิร์ค Go Fiber เว็บเฟรมเวิร์ค ที่ได้รับแรงบันดาลใจจาก Express ที่เขียนใน Go Fiber เป็นเฟรมเวิร์ค์เว็บ Go ที่สร้างขึ้นบน Fasthttp ซึ่งเป็นเอ็นจิ้น HTTP ที่เร็วที่สุดสำหรับ Go ได้รับการออกแบบมาเพื่อให้ง่ายต่อการพัฒนาอย่างรวดเร็วโดยคำนึงถึงการจัดสรรหน่วยความจำและประสิทธิภาพ
go get github.com/gofiber/fiber/v2
แพ็คเกจคืออะไร?
แพ็คเกจเป็นโค้ดภาษา Go ที่เขียนไว้สำหรับเรียกใช้งานด้วยการนำเข้า หรือ import เช่น
1. แพ็คเกจภายนอกที่เราไม่ได้เขียนเองเช่นที่ github.com หรือ gorm.io เป็นต้น
2. แพ็คเกจภายในที่เราเขียนภายในโปรเจคหรือโฟลเดอร์โมดูลของเราในตัวอย่างนี้คือ go-admin
การตั้งชื่อแพ็คเกจ / ฟังก์ชัน
หากโค้ดของเราใช้งานที่ $GOPATH/src/go-admin/database ชื่อแพ็คเกจควรเป็น database และชื่อฟังก์ชัน ตัวอักษรแรกต้องเป็นตัวพิมพ์ใหญ่เช่นในแพ็คเกจนี้ ใช้ชื่อว่า Connect
สร้างแพ็คเกจ database
สร้างแพ็คเกจดาต้าเบส database ทำหน้าที่เชื่อมต่อกับฐานข้อมูล MySQL โดยสร้างโฟลเดอร์ database แล้วสร้างไฟล์ชื่อ connect.go เขียนโค้ดดังนี้
- สร้างแพ็คเกจชื่อ database ด้วยโค้ด package database (สังเกต ชื่อจะเหมือนกับโฟลเดอร์)
- import GORM โดยการนำเข้าซอร์สโค้ดภายนอกจาก https://gorm.io/gorm โดยใช้ “gorm.io/gorm” และ นำเข้าซอร์สโค้ดที่ https://gorm.io/driver/mysql โดยใช้ “gorm.io/driver/mysql”
- ชื่อฟังก์ชันให้ชื่อว่า Connect (สังเกตตัวซีจะเป็นตัว C พิมพ์ใหญ่)
- dsn มีจุดสังเกตดังนี้คือ root คือชื่อผู้ใช้ , 12345678 คือรหัสผ่าน และ go_admin คือ ดาต้าเบส MySQL
package database
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
func Connect() {
dsn := "root:12345678@tcp(localhost:3306)/go_admin?charset=utf8&parseTime=True"
_, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
}
สร้างแพ็คเกจ controllers
สร้างแพ็คเกจ controllers สำหรับควบคุมการทำงานแต่ละฟังก์ชัน โดยสร้างโฟลเดอร์ controllers แล้วสร้างไฟล์ authController.go เขียนโค้ดดังนี้
- สร้างแพ็คเกจชื่อ controllers ด้วยโค้ด package controllers (สังเกต ชื่อจะเหมือนกับโฟลเดอร์)
- import เว็บเฟรมเวิร์ค Go Fiber โดยการนำเข้าซอร์สโค้ดภายนอกจาก https://github.com/gofiber/fiber/v2 โดยใช้ “github.com/gofiber/fiber/v2”
- ชื่อฟังก์ชันให้ชื่อว่า Hello (สังเกตตัวเอชจะเป็นตัว H พิมพ์ใหญ่)
- return ส่งค่าคืนเป็น Hello, world! สำหรับการแสดงผล
package controllers
import "github.com/gofiber/fiber/v2"
func Hello(c *fiber.Ctx) error {
return c.SendString("Hello, world!")
}
และสร้างไฟล์ otherController.go เขียนโค้ดดังนี้
- ชื่อฟังก์ชันให้ชื่อว่า Other (สังเกตตัวโอจะเป็นตัว O พิมพ์ใหญ่)
- return ส่งค่าคืนเป็น Other Controller สำหรับการแสดงผล
package controllers
import "github.com/gofiber/fiber/v2"
func Other(c *fiber.Ctx) error {
return c.SendString("Other Controller")
}
สร้างแพ็คเกจ routes
สร้างแพ็คเกจ routes สำหรับกำหนดเส้นทาง โดยสร้างโฟลเดอร์ routes แล้วสร้างไฟล์ routes.go เขียนโค้ดดังนี้
- สร้างแพ็คเกจชื่อ routes ด้วยโค้ด package routes (สังเกต ชื่อจะเหมือนกับโฟลเดอร์)
- import นำเข้าแพ็คเกจ controllers ซึ่งเป็น แพ็คเกจที่เราสร้างขึ้นมาด้วยการเขียนโค้ดเอง จะเป็น: “go-admin/controllers” และนำเข้า เว็บเฟรมเวิร์ค Go Fiber ซอร์สโค้ดภายนอกจาก https://github.com/gofiber/fiber/v2 โดยใช้ “github.com/gofiber/fiber/v2”
- ชื่อฟังก์ชันให้ชื่อว่า Setup (สังเกตตัวเอสจะเป็นตัว S พิมพ์ใหญ่)
- app.Get มี 2 เส้นทางคือ “/” (http://localhost:8000/) จะเรียกใช้ ฟังก์ชัน Hello จากแพ็คเกจ controllers ที่แสดงข้อความ Hello, world! และ “/other” (http://localhost:8000/other) จะเรียกใช้ฟังก์ชัน Other จากแพ็คเกจ controllers ที่แสดงข้อความ Other Controller
package routes
import (
"go-admin/controllers"
"github.com/gofiber/fiber/v2"
)
func Setup(app *fiber.App) {
app.Get("/", controllers.Hello)
app.Get("/other", controllers.Other)
}
สร้างแพ็คเกจ main
สร้างแพ็คเกจ main เพื่อเริ่มต้นในการทำงานของภาษา Go โดยสร้างไฟล์ main.go ภายในโฟลเดอร์ go-admin แล้วเขียนโค้ดดังนี้
- สร้างแพ็คเกจชื่อ main ด้วยโค้ด package main (การทำงานของ Go จะเริ่มต้นทำงานที่ แพ็คเกจชื่อ main เสมอ)
- import นำเข้าแพ็คเกจ database ซึ่งเป็น แพ็คเกจที่เราสร้างขึ้นมาด้วยการเขียนโค้ดเอง จะเป็น: “go-admin/database” และ นำเข้าแพ็คเกจ routes ซึ่งเป็น แพ็คเกจที่เราสร้างขึ้นมาด้วยการเขียนโค้ดเอง จะเป็น: “go-admin/routes”
- import นำเข้า เว็บเฟรมเวิร์ค Go Fiber ซอร์สโค้ดภายนอกจาก https://github.com/gofiber/fiber/v2 โดยใช้ “github.com/gofiber/fiber/v2”
- ชื่อฟังก์ชันให้ชื่อว่า main (main จะเป็นฟังก์ชันหลักของ Go)
- database.Connect() เรียกใช้ฟังก์ชัน Connect จากแพ็คเกจ database
- app := fiber.New() เริ่มต้นอินสแตนซ์ใหม่ของแอป Go Fiber
- routes.Setup(app) เรียกใช้ฟังก์ชัน Setup จากแพ็คเกจ routes เพื่อกำหนดเส้นทางให้กับ แอป Go Fiber
- app.Listen(“:8000”) กำหนดพอร์ตการทำงานของ แอป Go Fiber เป็นพอร์ต 8000
package main
import (
"go-admin/database"
"go-admin/routes"
"github.com/gofiber/fiber/v2"
)
func main() {
database.Connect()
app := fiber.New()
routes.Setup(app)
app.Listen(":8000")
}
ทดสอบได้โดยใช้คำสั่งต่อไปนี้:
go run main.go
ไปที่เว็บบราวเซอร์ ป้อน URL http://localhost:8000/ คุณจะเห็นว่า Hello, World! อยู่บนหน้าจอของคุณ
แต่ถ้าหากคุณป้อน URL http://localhost:8000/other แล้วขึ้นข้อความ Other Controller แสดงว่าขั้นตอนนี้สำเร็จแล้ว