Create your configuration file for your project
จาก section ก่อนหน้าจะสังเกตได้ว่าตอนนี้เรากำลังเชื่อม database ผ่าน connection string โดยเขียนไปในโค้ดโดยตรง ซึ่งถือเป็นสิ่งที่ไม่ควรทำครับ และสิ่งที่จะมาช่วยในส่วนนั้นก็คือการทำไฟล์เก็บ config หรือ token ต่าง ๆ ที่เราไม่ต้องการให้ผู้อื่นเห็นครับ เวลาเราอัพโหลดโค้ดขึ้น Github และเปิดเป็น public ก็จะไม่มีใครเห็นข้อมูลพวกนี้นั่นเอง (แต่อย่าลืมใส่ไปใน .gitignore นะครับ 55555)
ก่อนอื่นสร้างไฟล์ config.yaml
ขึ้นมาก่อนครับ แล้วใส่ข้อมูลที่เราอยากเก็บไปใน format yaml ได้เลย
JWT_SECRET: yoursecret
DB_HOST: yourconnectionstring
ต่อไปเรามาสร้าง model ที่จะเก็บ configuration ของเรากันดีกว่าครับ อย่างในตัวอย่างตอนนี้มี 2 value ซึ่งเราก็จะสร้าง struct ที่มี 2 value นั้นครับ โดยสร้าง folder config ขึ้นมา แล้วสร้าง ไฟล์ในนั้นชื่อ config.go
package config
type config struct {
JWT_SECRET string `yaml:"JWT_SECRET"`
DB_HOST string `yaml:"DB_HOST"`
}
หลังจากได้ model แล้วเราก็ต้องสร้างไฟล์ที่จะ run ทันทีเมื่อ project เราทำงานซึ่งจะคล้ายกับ function main ของเรานั่นเอง สิ่งนั้นคือ function init() นั่นเอง
โดยก่อนหน้านั้นเราจำเป็นต้องมี library "gopkg.in/yaml.v2"
ก่อนด้วยนะครับ โดย install ง่าย ๆ แค่พิมพ์คำสั่ง $ go get gopkg.in/yaml.v2
library นี้ก็จะอยู่ใน go.mod เราโดยอัตโนมัติ
package config
var C = new(config)
func init() {
yml, err := ioutil.ReadFile("config.yaml")
if err != nil {
panic(err)
}
err = yaml.Unmarshal(yml, C)
if err != nil {
panic(err)
}
}
โค้ดส่วนนี้ไม่มีอะไรมากครับ แค่ก่อนอื่นเราสร้างตัวแปล global ที่เป็น type config ที่เราสร้างไว้ก่อนหน้านี้ หลังจากนั้นสั่งอ่านไฟล์ที่ชื่อว่า config.yaml ที่เก็บข้อมูลของเราอยู่ แล้วยัดค่าที่อ่านได้นั้นลงไปในตัวแปลที่สร้างไว้
เท่านี้เราก็จะสามารถเรียกใช้ config ในไฟล์ไหนก็ได้ภายใน project เลยครับ
package main
func main() {
s := &http.Server{
Addr: ":8080",
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20,
}
db, err := sql.Open("mysql", config.C.DB_HOST) // Like this
if err != nil {
panic(err)
}
userRepository := repository.NewRepositoryDB(db)
userService := service.NewUserService(userRepository)
userHandler := handler.NewUserHandler(userService)
http.HandleFunc("/signup", userHandler.SignUp)
http.HandleFunc("/signin", userHandler.SignIn)
http.HandleFunc("/list", userHandler.ListUsers)
if err := s.ListenAndServe(); err != nil {
panic(err)
}
defer db.Close()
}