Skip to main content

Setup Project Structure และ การ Implement Fiber ใน Go

Setup Project Structure

https://github.com/golang-standards/project-layout

Project Structure นั้นไม่ตายตัว แต่ Golang มี standard ของการจัด project layout เราสามารถนำมาใช้กับ project ของเราได้

YourProjectName
|__ assets
|	|__ pics
|	|	|__ logo.png
|   |   |__ profileavatar.png
|	|
|	|__ data
|
|__ cmd
|	|__ server
|    	|__ main.go
|
|__ config
|
|__ pkg
	|__	foo.go
    |__ foofoo.go
    |__ bar
    	|__ bar.go

โดยทั่วไปแล้วตาม standard project layout เราจะมีโฟลเดอร์หลักๆคือ cmd และ pkg

cmd เก็บตัวโปรแกรมหลักของเราไว้ หรือเก็บ main.go ของเรา ซึ่งบางครั้ง main.go มีหน้าที่แค่เรียกใช้ code ส่วนอื่นมาใช้งานหรือทำหน้าที่เป็น entry point ของโปรแกรมเรานั้นเอง

ส่วน pkg คือโฟลเดอร์ที่เราเก็บการทำงานจริงๆของ function เราไว้เพื่อให้ไฟล์ใน cmd มาเรียกไปใช้อีกที

It's common to have a small main function that imports and invokes the code from the /internal and /pkg directories and nothing else.

การ Implement Fiber ใน Go (https://docs.gofiber.io/)

หลังจากเราทำการ setup project ของเราขึ้นมาแล้ว ให้เราทำการ download gofiber มาใช้

gofiber เป็น web framework ที่เอาไว้ใช้ทำ Web API

go get github.com/gofiber/fiber/v2

โดย gofiber นั้นได้รับแรงบันดาลใจมาจาก express.js สำหรับใครที่เคยใช้ express.js มาก่อนจึงสามารถเข้าใจ gofiber ได้อย่างง่ายดาย


ภายใน main.go

package main

import (
  "github.com/gofiber/fiber/v2"
)

func main() {
}


Setup server

package main

import (
  "github.com/gofiber/fiber/v2"
)

func main() {
  app := fiber.New()
  
  app.Get("/", func(c *fiber.Ctx) error {
    return c.SendString("Hello, world")
  })
  
  app.Listen(":8000")
}

เราเซ็ทให้ server ของเรารันที่ localhost:8000

หากเราลองไปที่ localhost:8000 หลังจากใช้คำสั่ง go run main.go แล้ว ก็จะพบกับข้อความ "Hello, world" ที่หน้าจอ browser ของเรา

หรือถ้าใช้ curl localhost:8000 ก็จะได้ข้อความ "Hello, world" ที่ terminal เช่นกัน


การทำ Routing

การทำ Routing คือการจัดการ response เมื่อผู้ใช้งานมาถึงที่ endpoint (URI หรือ Path) ของเราด้วย HTTP Method ต่างๆ (GET, PUT, POST, DELETE, etc.)


การทำ Routing ใน Go

app.Method(path string, ...func(*fiber.Ctx) error)

app คือ instance ของ fiber
Method คือ HTTP method: GET, PUT, POST, etc.
path คือ endpoint, URI ใน server ของเรา
func(*fiber.Ctx) error คือ callback function ที่เราจะใช้ดูแลการทำงานเมื่อผู้ใช้มาถึง endpoint ของเรา


อธิบายโค้ดตัวอย่าง

app.Get("/", func(c *fiber.Ctx) error {
  return c.SendString("Hello, world")
})

app.Get("/sayHi", func(c *fiber.Ctx) error {
  return c.SendString("Hi!")
})

เมื่อผู้ใช้งานมาถึง endpoint "/" (ในที่นี่คือ "localhost:8000/") callback function ของเราก็จะทำงานโดยส่ง "Hello, world" ไปให้ผู้ใช้งาน

ส่วน endpoint "/sayHi" (ในที่นี้คือ "localhost:8000/sayHi") callback function ของเราก็จะทำงานโดยส่ง "Hi!" ไปให้ผู้ใช้งาน


Parameter ใน routing

บางครั้ง URI ของเรานั้นไม่ได้ตั้งไว้ตายตัว (มี Parameter ใน URI) เราสามารถดึงค่าที่เปลี่ยนแปลงไปตาม request ของผู้ใช้ได้โดยการใช้ c.Params

การสร้าง endpoint ที่มี parameter (ใส่ ":" ข้างหน้าชื่อ parameter) 

app.Method("/:<ชื่อ parameter>", ...func(*fiber.Ctx) error)

ตัวอย่าง

// GET http://localhost:8000/hello%20world

app.Get("/:value", func(c *fiber.Ctx) error {
	return c.SendString("value: " + c.Params("value"))
	// => Get request with value: hello world
})

// GET http://localhost:8000/test
// value: test

// GET http://localhost:8000/golang%20tutorial%20for%20beginner
// value: golang tutorial for beginner


Optional Parameter

เราสามารถใส่ "?" หลัง parameter ของเรา เพื่อบอกว่าจะมีหรือไม่มี parameter ก็ได้

app.Method("/:value?", ...func(*fiber.Ctx) error)


Parameter แบบ Wildcard

สามารถใส่ "*" เพื่อบอกว่า URI ตรงนั้นเป็นอะไรก็ได้

// localhost:8000/user/<อะไรก็ได้>
app.Method("/user/*", ...func(*fiber.Ctx) error)

// localhost:8000/user/sorasora46
// localhost:8000/user/sora-k46
// localhost:8000/user/sora2k

// เมื่อผู้ใช้งานเรียกจาก URI ตัวอย่างด้านบน function ของเราที่เขียนไว้ซึ่งกำหนดให้ดูแล URI "/user/*" ก็จะทำงาน


การส่ง Static files จาก Server ใน Go

ส่ง HTML, CSS, Javascrip หรือรูปภาพ

app.Static(prefix, root string, config ...Static)

ตัวอย่าง

app := fiber.New()

app.Static("/", "./public")
// โหลด file จาก folder "public"

app.Listen(":8000")
public
|__ hello.html
|__ js
|	|__ jquery.js
|
|__ css
	|__ style.css

http://localhost:8000/hello.html
http://localhost:8000/js/jquery.js
http://localhost:8000/css/style.css


อ่านเพิ่มเติมได้ที่ Official website ของ Go fiber

คู่มือการสร้าง API ด้วยภาษา Go (https://docs.gofiber.io/api/fiber)