[ā§Ž.ā§Ē] āĻĒā§āϰāĻā§āĻā§āĻ āϤā§āϰāĻŋāϰ āϰā§āĻĄāĻŽā§āϝāĻžāĻĒ āĻāĻŦāĻ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ (Detailed project roadmap)
[ā§Ž.ā§Ē.ā§§] āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻ āĻŋāĻ āĻāϰāĻž
āĻāĻŋāĻā§ āĻāĻŋāĻā§ āĻāύāĻĢāϰāĻŽā§āĻļāύ āϏāĻŦāĻžāϰ āĻāύā§āϝ āĻāϞāĻžāĻĻāĻž āĻšāĻā§āĻžāĻāĻž āϏā§āĻŦāĻžāĻāĻžāĻŦāĻŋāĻāĨ¤ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻŽāϰāĻž āĻāĻŋāĻā§ āĻĒā§āϰāĻā§āĻā§āĻ āĻāύāĻĢāϰāĻŽā§āĻļāύ āĻļā§ā§āĻžāϰ āĻ āĻāϰāϤ⧠āĻāĻžāĻāĻŦā§ āύāĻžāĨ¤ āϝā§āĻŽāύ, āĻāĻŽāĻžāĻĻā§āϰ MySQL āĻĒā§āϰā§āĻĢāĻžāĻāϞā§āϰ āϝāĻžāĻŦāϤā§ā§āĨ¤ āϤāĻžāĻāĻžā§āĻž āĻāĻŽāϰāĻž āĻāĻžāĻāĻŦā§ āĻĒā§āϰāĻā§āĻā§āĻ āϰāĻžāύ āĻāϰāϤ⧠āĻĒā§āϰā§ā§āĻāύā§ā§ āĻĒāϰāĻŋāĻŦāϰā§āϤāύāĻļā§āϞ āĻā§āϝāĻžāϞā§āĻā§āϞā§āĻā§ āĻāĻŽāύ āĻāĻžāĻŦā§ āϏā§āĻ āĻāϰāϤā§, āϝāĻžāϤ⧠āĻāϰ⧠āϝ⧠āĻā§āĻ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰāĻā§āĻā§āĻ āύāĻžāĻŽāĻŋā§ā§ āϰāĻžāύ āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āϤāĻžāĻĻā§āϰ āύāĻŋāĻā§āĻĻā§āϰ āĻĄāĻŋāĻāĻžāĻāϏā§āĨ¤ āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āϏā§āĻ āϏā§āĻŦāĻŋāϧāĻžāĻāĻžāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻĻāĻŋā§ā§ āĻĨāĻžāĻā§āĨ¤ āĻļā§āϰā§āϤā§āĻ āĻāĻāĻĻāĻŽ āϰā§āĻā§ āĻāĻāĻāĻŋ app.env āĻĢāĻžāĻāϞ āϤā§āϰāĻŋ āĻāϰāĻŋ :
book-crud/app.env
DBUSER=root
DBPASS=191491
DBIP=tcp(127.0.0.1:3306)
DBNAME=bookstore
PORT=9030
DBIP āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻā§āύ āĻĒā§āϰā§āĻā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰāĻŦ, DBNAME āĻšāĻā§āĻā§ āϝ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏāĻāĻž āĻāĻŽāϰāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦāĨ¤ āϏāĻŦāĻļā§āώ⧠PORT āĻšāĻā§āĻā§ āĻāĻŽāĻžāĻĻā§āϰ āĻŦā§āϝāĻžāĻāĻāύā§āĻĄā§āϰ āϏāĻžāϰā§āĻāĻžāϰā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻā§āϰ āĻĒāĻĨāĨ¤
āĻāĻŋāĻā§ āĻŦāĻŋāώ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻā§ā§āĻžāϞ⧠āĻĨāĻžāĻāϤ⧠āĻšāĻŦā§ –Â
- āϝā§āύ āĻĄāĻžāĻāĻžāĻŦā§āϏāĻāĻž āĻāĻā§ āĻĨā§āĻā§āĻ āϤā§āϰāĻŋ āĻāϰāĻž āĻĨāĻžāĻā§āĨ¤
- āĻŦā§āϝāĻžāĻāĻāύā§āĻĄ āϏāĻžāϰā§āĻāĻžāϰā§āϰ āĻĒā§āϰā§āĻāĻāĻž āϝā§āύ āĻ āύā§āϝ āĻā§āĻĨāĻžāĻ āĻŦā§āϝāĻŦāĻšā§āϤ āύāĻž āĻĨāĻžāĻā§āĨ¤
[ā§Ž.ā§Ē.⧍] Viper āĻāϰ āϏāĻžāĻšāĻžāϝā§āϝ⧠āĻāύāĻāĻžā§āϰāύāĻŽā§āύā§āĻ āĻā§āϞā§āĻŦāĻžāϞāĻŋ āϏā§āĻ āĻāϰāĻžÂ
āĻļā§āϧ⧠app.env āĻĢāĻžāĻāϞ⧠āĻā§āϝāĻžāϞ⧠āĻā§āϞ⧠āϏā§āĻ āĻāϰāϞā§āĻ āĻšāĻŦā§āύāĻžāĨ¤ āϏā§āĻāĻžāĻā§ āϝā§āύ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§ā§āĻāύ⧠āĻāĻŽāϰāĻž āĻĒā§āϰāĻā§āĻā§āĻā§āϰ āϝā§āĻā§āύ⧠āĻāĻžā§āĻāĻž āĻĨā§āĻā§ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ āϏā§āĻāĻžāϰ āĻŦā§āϝāĻžāĻŦāϏā§āĻĨāĻžāĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āĻāĻ āĻāĻĻā§āĻĻā§āĻļā§āϝ⧠āĻāĻŽāϰāĻž viper āĻĒā§āϝāĻžāĻā§āĻāĻāĻž āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦāĨ¤ āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ āĻāĻ āϏā§āĻāĻāĻĒ āĻĒā§āϰāĻŖāĻžāϞ⧠āύāĻŋāĻā§ āĻŦā§āϝāĻžāĻā§āϝāĻž āĻāϰāĻž āĻšāϞ⧠–Â
āĻāĻāύ āĻāĻŽāϰāĻž āϝāĻž āĻā§āĻĄ āĻāϰāĻŦ āϤāĻžāϰ āϏāĻŦāĻ āĻšāĻŦā§ config/config.go āϤ⧠:Â
- āĻĒā§āϰāĻĨāĻŽā§āĻ āĻāĻŽāϰāĻž viper āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āύāĻžāĻŽāĻŋā§ā§ āύā§āĻŦā§āĨ¤ āĻāĻāύā§āϝ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ āĻĨā§āĻā§ āύāĻŋāĻā§āϰ āĻāĻŽāĻžāύā§āĻĄāĻāĻŋ āϰāĻžāύ āĻāϰāϤ⧠āĻšāĻŦā§Â go get github.com/spf13/viper
-  āĻāĻāĻāĻŋ Struct āϤā§āϰāĻŋ āĻāϰ⧠āύā§āĻŦā§ āϝāĻž go get github.com/spf13/viper āϤ⧠āĻāĻŽāϰāĻž āϏāĻāϞ āĻāύāĻāĻžāĻāϰāύāĻĒāĻŽā§āύā§āĻ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻā§āϞ⧠āĻŽā§āϝāĻžāĻĒ āĻāϰāĻŦ āĨ¤ āύāĻžāĻŽāĻāϰāĻŖā§āϰ āĻā§āώā§āϤā§āϰ⧠āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞāĻā§āϞā§āϰ āύāĻžāĻŽ āĻŦā§ āĻšāĻžāϤā§āϰ āĻ āĻā§āώāϰ āĻĻāĻŋā§ā§ āĻļā§āϰ⧠āĻāϰāϤ⧠āĻšāĻŦā§ āύāĻāϞ⧠āĻ āύā§āϝāĻžāύā§āϝ āĻāĻžā§āĻāĻž āĻĨā§āĻā§ āĻāϰ āĻ ā§āϝāĻžāĻā§āϏā§āϏ āĻĒāĻžāĻā§āĻž āϝāĻžāĻŦā§ āύāĻž –Â
type Config struct {
DBUser string `mapstructure:"DBUSER"`
DBPass string `mapstructure:"DBPASS"`
DBIP string `mapstructure:"DBIP"`
DbName string `mapstructure:"DBNAME"`
Port string `mapstructure:"PORT"`
}
  3. āĻāĻŦāĻžāϰ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻŦ InitConfig() āύāĻžāĻŽā§ āϝā§āĻāĻžāύ⧠āĻāĻŽāĻžāĻĻā§āϰ āϝāĻžāĻŦāϤā§ā§ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύā§āϰ āĻĒā§āϰā§ā§āĻāύā§ā§ āĻā§āϝāĻžāϞ⧠āĻā§āϞ⧠Config Struct āϏā§āĻ āĻāϰ⧠āĻĻāĻŋāĻŦā§
func InitConfig() (*Config) {
viper.AddConfigPath(".")
/* āϝāĻĻāĻŋ āĻāĻāĻĻāĻŽ āϰā§āĻā§ app.env āĻĢāĻžāĻāϞ āĻĨā§āĻā§ āĻĨāĻžāĻā§ āϤāĻžāĻšāϞ⧠āĻļā§āϧ⧠(.) āĻĻāĻŋā§ā§āĻ āĻāϰ āĻ
āĻŦāϏā§āĻĨāĻžāύ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāĻž āϝāĻžāĻŦā§āĨ¤ āĻ
āύā§āϝāĻĨāĻž āĻ
āĻŦāϏā§āĻĨāĻžāύ āĻ
āύā§āϝāĻžā§ā§ āĻĒāĻžāĻĨ āĻĻāĻŋāϤ⧠āĻšāĻŦā§ */
viper.SetConfigName("app") //āĻāύāĻĢāĻŋāĻ āĻĢāĻžāĻāϞā§āϰ āύāĻžāĻŽ
viper.SetConfigType("env") //āĻāύāĻĢāĻŋāĻ āĻĢāĻžāĻāϞā§āϰ āĻāĻā§āϏāĻā§āύāĻļāύ (env,json,yaml)
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err != nil {
log.Fatal("Error reading env file", err)
}
var config *Config
if err := viper.Unmarshal(&config); err != nil {
//config āϏā§āĻā§āϰāĻžāĻā§āĻā§ āϏāĻŦāĻā§āϞ⧠āĻā§āϝāĻžāϞ⧠āĻŽā§āϝāĻžāĻĒ āĻšā§ā§ āĻā§āϞā§
log.Fatal("Error reading env file", err)
}
return config
}
   4. āĻāĻŦāĻžāϰ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻŦ SetConfig() āύāĻžāĻŽā§ āϝā§āĻāĻž āĻāĻāĻŦāĻžāϰ āĻāϞ āĻāϰāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āϞā§āĻŦāĻžāϞ āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ⧠āĻĒā§āϰāĻĨāĻŽā§āĻ āϏāĻŦ āĻā§āϝāĻžāϞ⧠āύāĻŋā§ā§ āύāĻŋāĻŦā§ āĻāĻŦāĻ āĻĒā§āϰā§ā§āĻāύ āĻ āύā§āϏāĻžāϰ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦ āĨ¤
var LocalConfig *Config
func SetConfig() {
LocalConfig = InitConfig()
}
  5. āϏāĻŦāĻļā§āώ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻĄ āĻāĻž āϤāĻžāĻšāϞ⧠āĻĻāĻžāĻā§āĻžāĻā§āĻā§ – Â
config/config.go
package config
import (
"log"
"github.com/spf13/viper"
)
var LocalConfig *Config
type Config struct {
DBUser string `mapstructure:"DBUSER"`
DBPass string `mapstructure:"DBPASS"`
DBIP string `mapstructure:"DBIP"`
DbName string `mapstructure:"DBNAME"`
Port string `mapstructure:"PORT"`
}
func initConfig() *Config {
viper.AddConfigPath(".")
viper.SetConfigName("app")
viper.SetConfigType("env")
viper.AutomaticEnv()
if err := viper.ReadInConfig(); err != nil {
log.Fatal("Error reading env file", err)
}
var config *Config
if err := viper.Unmarshal(&config); err != nil {
log.Fatal("Error reading env file", err)
}
return config
}
func SetConfig() {
LocalConfig = initConfig()
}
[ā§Ž.ā§Ē.ā§Š] āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻā§āĻŦāĻŋāϞā§āϰ āĻŽāĻĄā§āϞ āϤā§āϰāĻŋ
āĻāĻāύ āĻāĻŽāϰāĻž āϝ⧠āĻŽāĻĄā§āϞāĻāĻŋ āĻŦāĻžāύāĻžāĻŦā§ āϤāĻž models/book.go āϤ⧠āĻĨāĻžāĻāĻŦā§ :Â
- āĻāĻāĻāĻŋ Book āύāĻžāĻŽā§āϰ Struct āϤā§āϰāĻŋ āĻāϰāĻŦ, āĻāĻāĻžāĻ āĻšāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āĻā§āĻŦāĻŋāϞā§āϰ āϏā§āĻāĻŋāĻŽāĻž –Â
models/book.go
package models
type Book struct {
ID uint `gorm:"primaryKey;autoIncrement"`
BookName string
Author string
Publication string
}
    2. āĻāĻāĻžāύ⧠ID āĻāϰ āĻĒāĻžāĻļā§ gorm āĻāϰ āĻā§āϝāĻžāĻ primaryKey āĻāĻŦāĻ autoIncrement āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āĻāĻā§āϞā§āϰ āĻāĻžāĻ āĻāĻĻā§āϰ āύāĻžāĻŽā§āĻ āĻĒā§āϰāĻāĻžāĻļ āĻĒāĻžāĻā§āĻā§āĨ¤
[ā§Ž.ā§Ē.ā§Ē] āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāĻžāύā§āĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύÂ
āĻāĻāύ āĻāĻŽāϰāĻž āϝāĻž āĻā§āĻĄ āĻāϰāĻŦ āϤāĻžāϰ āϏāĻŦāĻ āĻšāĻŦā§ connection/connection.go āϤ⧠:Â
-  āĻĒā§āϰāĻĨāĻŽā§āĻ gorm āĻāĻŦāĻ MySQL āĻāϰ āĻāύā§āϝ āĻĒā§āϰā§ā§āĻāύā§ā§ āĻĒā§āϝāĻžāĻā§āĻāĻā§āϞ⧠āύāĻžāĻŽāĻŋā§ā§ āύā§āĻāĨ¤ āĻāĻāύā§āϝ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠āύāĻŋāĻā§āϰ āĻā§āĻĄ āĻā§āϞ⧠āϰāĻžāύ āĻāϰāĻŦ –
āϏāĻžāĻĨā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāϰ⧠⧍ āĻāĻŋ āϞā§āĻāĻžāϞ āĻĒā§āϝāĻžāĻā§āĻ āĻāĻā§āϏāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āϏā§āĻā§āϞ⧠āĻšāĻā§āĻā§ āĻāĻāĻā§ āĻāĻā§āϰ āĻŦāĻžāύāĻžāύ⧠“Go-bootcamp/pkg/config” āĻ “Go-bootcamp/pkg/models” āĻĒā§āϝāĻžāĻā§āĻāĨ¤
   2. āĻāĻŦāĻžāϰ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ *gorm.DB āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻāĻŦāĻ Connect() āύāĻžāĻŽā§ āĻĢāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻŦ, āϝā§āĻāĻŋ config/config.go āĻāϰ LocalConfig āĻāϰ āĻĢāĻŋāϞā§āĻĄ āĻā§āϝāĻžāϞ⧠āĻā§āϞ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻžāύā§āĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦā§āĨ¤ āϏāĻŦāĻļā§āώ⧠āϤā§āϰāĻŋāĻā§āϤ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏāĻāĻŋ *gorm.DB āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞāĻāĻŋāϤ⧠āϰāĻžāĻāĻŦā§ āĻāĻŦāĻ āĻāĻ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻ āĻāĻŽāϰāĻž āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āύāĻžāύāĻžāύ āĻ āĻĒāĻžāϰā§āĻļāύ āĻāϰāĻŦ –Â
go get gorm.io/gorm
go get gorm.io/driver/mysql
āϏāĻžāĻĨā§ āĻāĻŽāĻžāĻĻā§āϰ āĻāϰ⧠⧍ āĻāĻŋ āϞā§āĻāĻžāϞ āĻĒā§āϝāĻžāĻā§āĻ āĻāĻā§āϏāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āϏā§āĻā§āϞ⧠āĻšāĻā§āĻā§ āĻāĻāĻā§ āĻāĻā§āϰ āĻŦāĻžāύāĻžāύ⧠“go-bootcamp/pkg/config” āĻ “go-bootcamp/pkg/models” āĻĒā§āϝāĻžāĻā§āĻāĨ¤
   3.  āĻāĻŦāĻžāϰ⧠āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ *gorm.DB āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞ āĻāĻŦāĻ Connect() āύāĻžāĻŽā§ āĻĢāĻžāĻāĻļāύ āϤā§āϰāĻŋ āĻāϰāĻŦ, āϝā§āĻāĻŋ config/config.go āĻāϰ LocalConfig āĻāϰ āĻĢāĻŋāϞā§āĻĄ āĻā§āϝāĻžāϞ⧠āĻā§āϞ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻžāύā§āĻāĻļāύ āϏā§āĻĨāĻžāĻĒāύ āĻāϰāĻŦā§āĨ¤ āϏāĻŦāĻļā§āώ⧠āϤā§āϰāĻŋāĻā§āϤ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏāĻāĻŋ *gorm.DB āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞāĻāĻŋāϤ⧠āϰāĻžāĻāĻŦā§ āĻāĻŦāĻ āĻāĻ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻ āĻāĻŽāϰāĻž āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āύāĻžāύāĻžāύ āĻ āĻĒāĻžāϰā§āĻļāύ āĻāϰāĻŦ –Â
var db *gorm.DB
func connect() {
dbConfig := config.LocalConfig
dsn := fmt.
Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local",
dbConfig.DBUser, dbConfig.DBPass, dbConfig.DBIP, dbConfig.DbName)
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
fmt.Println("error connecting to DB")
panic(err)
}
fmt.Println("Database Connected")
db = d
}
   4. āĻāĻŦāĻžāϰ⧠āĻāĻāĻāĻŋ Migrate() āĻĢāĻžāĻāĻļāύ āĻŦāĻžāύāĻžāĻŦ āϝāĻžāϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāĻŽāĻžāĻĻā§āϰ āĻŽāĻĄā§āϞ āĻ āύā§āϝāĻžā§ā§ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻā§āĻŦāĻŋāϞ āϤā§āϰāĻŋ āĻŦāĻž āĻāĻĒāĻĄā§āĻ āĻšāĻŦā§ āĻĒā§āϰāϤāĻŋāĻŦāĻžāϰ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āϰāĻžāύ āĻāϰāĻžāϰ āϏāĻŽā§āĨ¤
func migrate() {
db.Migrator().AutoMigrate(&models.Book{})
}
   5. āϏāĻŦāĻļā§āώ⧠āĻāĻāĻāĻŋ GetDB() āĻĢāĻžāĻāĻļāύ āĻŦāĻžāύāĻžāĻŦā§, āϝā§āĻāĻŋ connect() āĻ migrate() āĻĢāĻžāĻāĻļāύ āĻāĻžāϞāĻŋā§ā§ āĻāĻĒāĻĄā§āĻā§āĻĄ *gorm.DB āĻāϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻŦā§āĨ¤
func GetDB() *gorm.DB {
if db == nil {
connect()
}
migrate()
return db
}
   6. āϤāĻžāĻšāϞ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĢāĻžāĻāύāĻžāϞ āĻā§āĻĄāĻāĻŋ āĻĻāĻžāĻā§āĻžāĻā§āĻā§ –Â
connection/connection.go
package connection
import (
"fmt"
"go-bootcamp/pkg/config"
"go-bootcamp/pkg/models"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)
var db *gorm.DB
func connect() {
dbConfig := config.LocalConfig
dsn := fmt.
Sprintf("%s:%s@%s/%s?charset=utf8mb4&parseTime=True&loc=Local",
dbConfig.DBUser, dbConfig.DBPass, dbConfig.DBIP, dbConfig.DbName)
d, err := gorm.Open(mysql.Open(dsn), &gorm.Config{
Logger: logger.Default.LogMode(logger.Info),
})
if err != nil {
fmt.Println("error connecting to DB")
panic(err)
}
fmt.Println("Database Connected")
db = d
}
func migrate() {
db.Migrator().AutoMigrate(&models.Book{})
}
func GetDB() *gorm.DB {
if db == nil {
connect()
}
migrate()
return db
}
ā§Ž.ā§Ē.ā§Ģ main āĻĢāĻžāĻāĻļāύ āĻāĻŦāĻ ECHO āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ
āĻāĻāύ āĻāĻŽāϰāĻž āϝāĻž āĻā§āĻĄ āĻāϰāĻŦ āϤāĻž āĻšāĻŦā§ main.go āϤ⧠:Â
- main.go āϤ⧠main() āĻĢāĻžāĻāĻļāύā§āϰ āĻŽāϧā§āϝ⧠āĻāĻŽāϰāĻž echo.New() āĻĢāĻžāĻāĻļāύ āĻāϞ āĻāϰ⧠āĻĄāĻŋāĻĢāϞā§āĻ āĻāύāĻĢāĻŋāĻāĻžāϰā§āĻļāύ āϏāĻš ECHO āĻĢā§āϰā§āĻŽāĻā§āĻžāϰā§āĻā§āϰ āĻāĻāĻāĻŋ āύāϤā§āύ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ āĻāϰāĻŋāĨ¤ āϤāĻžāϰ āĻāĻā§ āĻāĻŽāĻžāĻĻā§āϰ echo āĻāϰ āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āύāĻžāĻŽāĻžāύā§āϰ āĻāύā§āϝ āĻāĻžāϰā§āĻŽāĻŋāύāĻžāϞ⧠āύāĻŋāĻā§ āĻā§āĻĄāĻāĻŋ āϰāĻžāύ āĻāϰāĻŦ – go get github.com/labstack/echo/v4 āĻāϰāĻĒāϰ –Â
func main() {
e := echo.New()
}
   2. āĻāĻŦāĻžāϰ⧠āĻāĻŽāϰāĻž āĻāĻ echo.Echo āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻāĻŋ container/serve.go āϤ⧠āĻĒāĻžāĻ āĻŋā§ā§ āĻĻāĻŋāĻŦā§ āĻāĻŦāĻ āĻŦāĻžāĻāĻŋ āϏāĻŦāϧāϰāύā§āϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻāύā§āĻā§āϰā§āϞā§āϰ āĻāĻžāĻ āĻāĻāĻžāύā§āĻ āĻšāĻŦā§āĨ¤ āĻāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/containers” āϞā§āĻāĻžāϞ āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤Â
package main
import (
"Go-bootcamp/pkg/containers"
"github.com/labstack/echo/v4"
)
func main() {
e := echo.New()
containers.Serve(e)
}
[ā§Ž.ā§Ē.ā§Ŧ] Routes āĻāύā§āĻā§āϰā§āϞ āĻāĻŦāĻ āϏāĻžāϰā§āĻāĻžāϰ āĻāĻžāϞāĻžāύā§
āĻāĻāύ āĻāĻŽāϰāĻž container/serve.go āϤ⧠āĻā§āĻĄ āĻāϰāĻŦ :Â
-  āĻāĻāĻžāύ⧠āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ Serve() āϤā§āϰāĻŋ āĻāϰāĻŦ āϝāĻž main.go āĻĨā§āĻā§ āĻāϏāĻž echo.Echo āĻāύā§āϏāĻā§āϝāĻžāύā§āϏāĻāĻŋāĻā§ āϰāĻŋāϏāĻŋāĻ āĻāϰāĻŦā§ āĻāĻŦāĻ āϤāĻž routes/book.go āϤ⧠āĻĒāĻžāĻ āĻŋā§ā§ āĻĻāĻŋāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰā§ā§āĻāύā§ā§ āϏāĻāϞ routes āϤā§āϰāĻŋāϰ āĻāύā§āϝ āĨ¤ āĻāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āϞā§āĻāĻžāϞ āĻĒā§āϝāĻžāĻā§āĻ “Go-bootcamp/pkg/routes” āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ “github.com/labstack/echo/v4” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋāĻ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤
- āϏāĻžāĻĨā§ āϏāĻžāϰā§āĻāĻžāϰ āϰāĻžāύ āĻāϰāĻžāϰ āĻāύā§āϝ config/config.go āĻāϰ LocalConfig āĻā§āϝāĻžāϰāĻŋā§ā§āĻŦāϞāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦāĨ¤ āϤāĻžāϰ āĻāĻā§ āĻāĻŽāϰāĻž SetConfig() āĻĢāĻžāĻāĻļāύāĻāĻž āĻāĻžāϞāĻžāĻŦā§, āĻāĻžāϰāĻŖ āĻāĻŽāĻžāĻĻā§āϰ āĻĒā§āϰ⧠āĻĒā§āϰāĻā§āĻā§āĻā§āϰ āϏāĻŦāϧāϰāύā§āϰ Initialization āĻāϰ āĻāĻžāĻ āĻāĻ Serve() āĻĢāĻžāĻāĻļāύā§āϰ āĻŽāĻžāϧā§āϝāĻŽā§ āĻāϰāĻŦ āĨ¤ āĻāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ āϞā§āĻāĻžāϞ āĻĒā§āϝāĻžāĻā§āĻ “Go-bootcamp/pkg/config” āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤Â
- āĻāϰ āĻāĻā§ āϝ⧠āĻāĻŽāϰāĻž āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āϏāĻāϝā§āĻ āϏā§āĻĨāĻžāĻĒāύā§āϰ āĻāύā§āϝ LocalConfig āĻāϰ āĻā§āϝāĻžāϞ⧠āĻā§āϞ⧠āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰā§āĻāĻŋ āϏā§āĻāĻž āϏāĻŽā§āĻāĻŦ āĻšāĻŦā§ āύāĻž Serve() āĻĢāĻžāĻāĻļāύāĻāĻŋ āϰāĻžāύ āĻāϰāĻž āĻŦā§āϝāϤāĻŋāϤāĨ¤
- āϤāĻžāĻšāϞ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĢāĻžāĻāύāĻžāϞ āĻā§āĻĄāĻāĻŋ āĻĻāĻžāĻā§āĻžāĻā§āĻā§ –Â
 container/serve.go
package containers
import (
"fmt"
"Go-bootcamp/pkg/config"
"Go-bootcamp/pkg/routes"
"log"
"github.com/labstack/echo/v4"
)
func Serve(e *echo.Echo) {
config.SetConfig()
// config initialization
routes.BookRoutes(e)
log.Fatal(e.Start(fmt.Sprintf(":%s", config.LocalConfig.Port)))
// āϏāĻžāϰā§āĻāĻžāϰ āϏā§āĻāĻžāϰā§āĻ
}
āĻŦāĻŋāĻāĻĻā§āϰāĻ āĻ āύā§āϝāĻžāύā§āϝ āϏāĻŦāĻāĻŋāĻā§āϰ āĻŽāϤ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ āĻ āĻŽā§āϝāĻžāύā§āĻ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻāĻŦāĻžāϰ container/serve.go āϤ⧠āĻĢā§āϰāϤ āĻāϏāĻŦāĨ¤Â
[ā§Ž.ā§Ē.ā§] Routes āϤā§āϰāĻŋ
āĻāĻāύ āĻāĻŽāϰāĻž āϝāĻž āĻā§āĻĄ āĻāϰāĻŦ āϤāĻž āĻšāĻŦā§ routes/book.go āϤ⧠:Â
-  āĻĒā§āϰāĻĨāĻŽā§āĻ āĻāĻŽāϰāĻž āĻāĻāĻāĻŋ āĻā§āϰā§āĻĒ āĻāϰāĻŦ echo.Echo āĻāύā§āϏāĻā§āϝāĻžāύā§āϏāĻāĻŋ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāĻŦāĻ āĻāĻŽāĻžāĻĻā§āϰ āĻ āύā§āϝāĻžāύā§āϝ āϏāĻāϞ route, āĻāĻ āĻā§āϰā§āĻĒā§āϰ āĻŽāϧā§āϝ⧠āĻĒā§āĻŦā§āĨ¤ āĻ āϰā§āĻĨāĻžā§ āĻā§āϰā§āĻĒā§āϰ route āϝāĻĻāĻŋ /bookstore āĻšā§ā§ āĻĨāĻžāĻā§ āϤāĻžāĻšāϞ⧠āĻāĻ āĻā§āϰā§āĻĒā§āϰ āĻŽāϧā§āϝā§āϰ /book – route āĻāĻŋ āĻāϏāϞ⧠/bookstore/book – route āĻāĻŋ āύāĻŋāϰā§āĻĻā§āĻļ āĻāϰāĻŦā§āĨ¤ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāĻŽāĻžāĻĻā§āϰ “github.com/labstack/echo/v4” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§ :  Â
book := e.Group("/bookstore")
   2. āĻāĻŦāĻžāϰ⧠āĻāĻŽāĻžāĻĻā§āϰ route āĻā§āϞ⧠book āĻā§āϰā§āĻĒā§āϰ āύāĻŋāĻā§ āϤā§āϰāĻŋ āĻāϰāĻŦ āĻāĻŦāĻ āĻĒā§āϰāϤā§āϝā§āĻ route āĻāĻŋāύā§āύ āĻāĻŋāύā§āύ āϰāĻŋāĻā§ā§ā§āϏā§āĻā§āϰ āĻāύā§āϝ āĻāύā§āĻĄāĻĒā§ā§āύā§āĻ āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāĻ āĻāϰāĻŦā§āĨ¤Â
   3. āĻĒā§āϰāϤā§āϝā§āĻ āĻāύā§āĻĄāĻĒā§ā§āύā§āĻ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻāĻŋ āĻāϰ⧠āĻĢāĻžāĻāĻļāύ āĻŦā§āϝāĻŦāĻšā§āϤ āĻšāĻŦā§, āϝā§āĻā§āϞā§āĻā§ āĻŦāϞāĻž āĻšā§ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻāĻŦāĻ āĻāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠controllers/book.go āϤ⧠āĻĨāĻžāĻāĻŦā§āĨ¤ āϏā§āϤāϰāĻžāĻ āĻāĻā§āώā§āϤā§āϰ⧠āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/controllers” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻā§āĻā§āĨ¤
   4. āĻĒā§āϰ⧠āĻā§āĻĄāĻāĻŋ āϤāĻžāĻšāϞ⧠āĻĻāĻžāĻā§āĻžāĻā§āĻā§ –Â
package routes
import (
"Go-bootcamp/pkg/controllers"
"github.com/labstack/echo/v4"
)
func BookRoutes(e *echo.Echo) {
book := e.Group("/bookstore")
book.POST("/book", controllers.CreateBook)
book.GET("/book", controllers.GetBooks)
book.PUT("/book/:bookID", controllers.UpdateBook)
book.DELETE("/book/:bookID", controllers.DeleteBook)
}
 5. āĻāĻāĻžāύ⧠POST, GET, PUT, DELETE āĻā§āϞā§āĻ āĻšāĻā§āĻā§ HTTP āϰāĻŋāĻā§ā§ā§āϏā§āĻā§āϰ āϧāϰāĻŖ āĻāĻŦāĻ āĻāĻ āĻ āύā§āϝāĻžā§ā§ āĻĒā§āϰāϤā§āϝā§āĻā§āϰ āĻšā§āϝāĻžāύā§āĻĄāϞāĻžāϰ āĻĢāĻžāĻāĻļāύ āĻā§āϞ⧠āϰā§āϏāĻĒāύā§āϏ āϤā§āϰāĻŋ āĻāϰāĻŦā§āĨ¤
[ā§Ž.ā§Ē.ā§Ž] āĻāύā§āĻā§āϰā§āϞāĻžāϰā§āϰ āĻā§āĻā§āĻ āĻŦāĻŋāĻŦāϰāĻŖā§Â
āϝā§āĻšā§āϤ⧠routes/book.go āĻ controllers/book.go āĻāϰ āĻāϞā§āϞā§āĻ āĻāϰā§āĻāĻŋ āϏā§āϤāϰāĻžāĻ āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž āĻāĻĒāĻžāϤāϤ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āϤā§āϰāĻŋ āĻāϰ⧠āϰā§āĻā§ āϝāĻžāĻāĨ¤ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻšā§āϝāĻžāύā§āĻĄā§āϞ āĻāϰāĻž āĻāĻŦāĻ āϰā§āϏāĻĒāύā§āϏā§āϰ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻžāύāĻŋāĻāĻāĻž āĻĒāϰ⧠āϝā§ā§ā§ āĻĻā§āĻāĻŦ –
package controllers
import "github.com/labstack/echo/v4"
func CreateBook(e echo.Context) error
func GetBooks(e echo.Context) error
func UpdateBook(e echo.Context) error
func DeleteBook(e echo.Context) error
[ā§Ž.ā§Ē.⧝] āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ
āĻāĻ āĻ āĻāĻļāĻāĻž āĻĒā§āϰ⧠āĻĒā§āϰāĻā§āĻā§āĻā§āϰ āĻ āϤā§āϝāύā§āϤ āĻā§āϰā§āϤā§āĻŦāĻĒā§āϰā§āĻŖ āĻāĻāĻāĻŋ āĻ āĻāĻļāĨ¤ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āϏāĻžāĻĨā§ āĻāĻŽāϰāĻž āĻĒāĻžāϰā§āĻ ā§Š āĻĨā§āĻā§āĻ āĻĒāϰāĻŋāĻāĻŋāϤāĨ¤ āϏāĻšāĻ āĻāĻžāώāĻžā§, āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻšāϞ⧠āĻāĻŋāĻā§ āĻĢāĻžāĻāĻļāύā§āϰ āϏāĻŽāώā§āĻāĻŋāĨ¤ āĻāĻā§āώā§āϤā§āϰ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāĻŦāĻ āϏāĻžāϰā§āĻāĻŋāϏ⧠Create, Read, Update āĻāĻŦāĻ Delete āĻ āĻĒāĻžāϰā§āĻļāύā§āϰ āĻāύā§āϝ āĻāĻŋāĻā§ āĻĢāĻžāĻāĻļāύ āĻ āĻŦāĻļā§āϝ āĻĒā§āϰā§ā§āĻāύāĨ¤Â
āĻ āύā§āĻ āĻā§āϞ⧠āĻĢāĻžāĻāĻļāύ āύāĻŋā§ā§ āĻāĻžāĻ āĻāϰāϤ⧠āĻā§āϞ⧠āϝ⧠āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāϤ⧠āĻšā§ āϏā§āĻāĻž āĻšāĻā§āĻā§ āĻāĻāύ āĻā§āύ āĻĢāĻžāĻāĻļāύ āύāĻŋā§ā§ āĻāĻžāĻ āĻāϰāĻāĻŋ āϏā§āĻāĻž āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻĨāĻžāĻā§ āύāĻžāĨ¤ āĻāĻŋāύā§āϤ⧠āĻāĻŽāϰāĻž āĻāĻ āϏāĻŽāϏā§āϝāĻžāϰ āϏāĻŽāĻžāϧāĻžāύ āĻšāĻŋāϏā§āĻŦā§ āϝāĻž āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋ āϏā§āĻāĻž āĻšāĻā§āĻā§, āĻāĻ āĻ āĻŦāĻļā§āϝ āĻĢāĻžāĻāĻļāύāĻā§āϞā§āϰ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰāĻžāĻāĻžāĻā§ āĻāĻŦāĻļā§āϝāĻ āĻŦāĻžāύāĻŋā§ā§ āĻĢā§āϞāĻžāĨ¤ āϏāĻšāĻ āĻāĻžāώāĻžā§, āϝāĻĻāĻŋ āĻāĻŽāϰāĻž āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻā§āύ⧠āĻĢāĻžāĻāĻļāύ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āύāĻž āĻāϰāĻŋ āĻŦāĻž āϏāĻ āĻŋāĻ āĻāĻĒāĻžā§ā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āύāĻž āĻāϰāĻŋ, āϏā§āĻā§āώā§āϤā§āϰ⧠āĻāĻŽāϰāĻž āĻāϰāϰā§āϰ āϏāĻŽā§āĻŽā§āĻā§āύ āĻšāĻŦā§āĨ¤Â
āĻāĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻā§āĻļāύāĻā§ āĻŦāĻžāϧā§āϝāĻŦāĻžāϧāĻāϤāĻžā§ āϰā§āĻĒāĻžāύā§āϤāϰ āĻāϰāĻžāϰ āĻĒāĻĻā§āϧāϤāĻŋāĻ āĻšāϞ⧠āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĨ¤
āĻĒā§āϰāĻĨāĻŽā§āĻ āĻāĻŽāϰāĻž domain/book.go āϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻā§āϞ⧠āϞāĻŋāĻā§ āĻĢā§āϞāĻŋ :Â
package domain
import (
"Go-bootcamp/pkg/models"
"Go-bootcamp/pkg/types"
)
// āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāύā§āĻāĻžāϰāĻĢā§āϏ
type IBookRepo interface {
GetBooks(bookID uint) []models.Book
CreateBook(book *models.Book) error
UpdateBook(book *models.Book) error
DeleteBook(bookID uint) error
}
// āϏāĻžāϰā§āĻāĻŋāϏ āĻāύā§āĻāĻžāϰāĻĢā§āϏ
type IBookService interface {
GetBooks(bookID uint) ([]types.BookRequest, error)
CreateBook(book *models.Book) error
UpdateBook(book *models.Book) error
DeleteBook(bookID uint) error
}
-
āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻāϰ āĻĒā§āϰā§ā§āĻÂ
[ā§Ž.ā§Ē.ā§§ā§Ļ] āĻĒā§āϰā§ā§āĻāύā§ā§ Struct āϤā§āϰāĻŋÂ
āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻ āĻāĻļā§āϰāϰ IBookService āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āϰāĻŋāĻāĻžāϰā§āύāĻāĻžāĻāĻĒā§ āĻāĻŽāϰāĻž types.BookRequest āĻāϰ āĻāĻāĻāĻŋ āĻ ā§āϝāĻžāϰ⧠āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻāĻŋāĨ¤ āĻāĻŽāϰāĻž models.Book āĻāϰ āĻ ā§āϝāĻžāϰ⧠āϰāĻŋāĻāĻžāϰā§āύ āύāĻž āĻāϰ⧠types.BookRequest āĻāϰ āĻ ā§āϝāĻžāϰ⧠āϰāĻŋāĻāĻžāϰā§āύ āĻāϰāĻžāϰ āĻāĻžāϰāĻŖ āĻšāϞā§, āĻāĻŽāϰāĻž models.Book āĻāϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻļā§āϧ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāĻžāĻā§ āĻāϰāĻŦ, āϝā§āĻšā§āϤ⧠āĻāĻāĻž āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻā§āĻŦāĻŋāϞā§āϰ āϏā§āĻāĻŋāĻŽāĻžāĨ¤ āĻāϰ āϏāĻžāϰā§āĻāĻŋāϏ āĻĒā§āϝāĻžāĻā§āĻā§ āϝā§āĻšā§āϤ⧠āĻāĻŽāϰāĻž āϰā§āϏāĻĒāύā§āϏ āϤā§āϰāĻŋ āĻāϰ⧠āĻāύā§āĻā§āϰā§āϞāĻžāϰ⧠āĻĒāĻžāĻ āĻžāĻŦā§ āϏā§āĻšā§āϤ⧠āϏā§āĻ āϰā§āϏāĻĒāύā§āϏāĻāĻžāϰ āĻāύā§āϝ āĻāĻŽāϰāĻž āĻāϞāĻžāĻĻāĻž Struct āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻŦāĨ¤Â
āϤāĻžāĻšāϞ⧠types/structures.go āϤ⧠āĻāĻŽāϰāĻž āĻāĻ āĻāĻžāϏā§āĻāĻŽ Struct āĻā§āϞ⧠āϰāĻžāĻāĻŦ – types/structures.goÂ
package types
type BookRequest struct {
ID uint `json:"bookID"`
BookName string `json:"bookname"`
Author string `json:"author"`
Publication string `json:"publication,omitempty"`
}
āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāϰ⧠āĻāĻžāϏā§āĻāĻŽ Struct āĻāϰ āĻĒā§āϰā§ā§āĻāύ āĻĒāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āϏā§āĻā§āϞā§āϰ āϏāĻŦāĻ āĻāĻŽāϰāĻž types/structures.go āϤ⧠āϰāĻžāĻāĻŦāĨ¤Â
[ā§Ž.ā§Ē.ā§§ā§§] āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻĢāĻžāĻāĻļāύāĻā§āϞā§āϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻÂ
domain/book.go āϤ⧠āĻāϞā§āϞā§āĻāĻŋāϤ IBookRepo āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻāĻžāĻ āĻšāϞ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻĢāĻžāĻāĻļāύ āĻā§āϞā§āϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ, āĻ āϰā§āĻĨāĻžā§ āĻāĻ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻĻā§āĻŦāĻžāϰāĻž āĻāĻŽāϰāĻž āϏāϰāĻžāϏāϰāĻŋ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āϏāĻžāĻĨā§ āϝā§āĻāĻžāϝā§āĻ āĻāϰāĻŦāĨ¤ āĻāĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/domain” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤Â
āϝā§āĻšā§āϤ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻ āĻĒāĻžāϰā§āĻļāύ āĻā§āϞā§āϰ āĻāύā§āϝ *gorm.DB āĻŦāĻž āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āĻĒā§āϰā§ā§āĻāύ āĻšāĻŦā§, āϏā§āϤāϰāĻžāĻ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏāĻāĻŋ āĻāĻāĻāĻŋ āĻ āĻŦāĻā§āĻā§āĻā§āϰ āĻŽāϧā§āϝ⧠āϰā§āĻā§ āĻāĻŽāϰāĻž āĻāĻĒāϰā§āĻā§āϤ āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋ āĻāĻā§āϤ āĻ āĻŦāĻā§āĻā§āĻā§āϰ āϏāĻžāĻĨā§ āĻŦāĻžāĻāύā§āĻĄ āĻāϰ⧠āĻĻāĻŋāϤ⧠āĻĒāĻžāϰāĻŋ :Â
type bookRepo struct {
db *gorm.DB
}
func BookDBInstance(d *gorm.DB) domain.IBookRepo {
return &bookRepo{
db: d,
}
}
āĻāĻĒāϰā§āĻā§āϤ āĻā§āĻĄā§ āĻāĻŋ āĻšā§ā§āĻā§ āϤāĻž āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ āĻŦā§āĻāĻŋā§ā§ āĻĻāĻŋāĻā§āĻāĻŋ –Â
- āĻĒā§āϰāĻĨāĻŽāϤ āĻāĻāĻāĻŋ Struct āύā§ā§āĻž āĻšā§ā§āĻā§, bookRepo āύāĻžāĻŽā§, āϝāĻžāϰ āĻā§āϤāϰ⧠āĻāĻāĻāĻŋ āĻĢāĻŋāϞā§āĻĄ db āϰāĻžāĻāĻž āĻšā§ā§āĻā§ *gorm.DB āĻāĻžāĻāĻĒāĨ¤
- āĻĒāϰāĻŦāϰā§āϤ⧠āϧāĻžāĻĒā§ BookDBInstance() āĻĢāĻžāĻāĻļāύ⧠āĻŦāĻžāĻāϰ⧠āĻĨā§āĻā§ āĻā§āύ⧠*gorm.DB āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻāϏāĻžāϰ āĻĒāϰ āϤāĻž bookRepo āĻāϰ db āϤ⧠āϰā§āĻā§ āϰāĻŋāĻāĻžāϰā§āύ āĻāĻžāĻāĻĒā§ domain/book.go āĻāϰ IBookRepo āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋ āĻĻā§ā§āĻž āĻšā§ā§āĻā§āĨ¤
- āĻāĻāĻž āĻāϰāĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§āĻ āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§ āĻĒā§āϰ⧠āĻĢāĻžāĻāĻļāύāĻāĻžā§ āĻāϰāϰ āĻĻā§āĻāĻžāĻā§āĻā§āĨ¤ āĻāĻžāϰāĻŖ, āĻāĻāύ āĻāĻ bookRepo āĻ āĻŦāĻā§āĻā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋāϰ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻšā§ā§ āĻāĻŋā§ā§āĻā§ āĻāĻŦāĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻ āĻŦāĻā§āĻā§āĻāĻāĻŋāϰ āĻŽā§āĻĨāĻĄ āĻšāĻŋāϏā§āĻŦā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āύāĻž āĻāϰāĻž āĻĒāϰā§āϝāύā§āϤ āĻāĻ āĻāϰāϰ āĻĻā§āĻāĻžāϤ⧠āĻĨāĻžāĻāĻŦā§āĨ¤
- āĻāĻāύ āĻāĻŽāϰāĻž āĻĢāĻžāĻāĻļāύāĻā§āϞā§āϰ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āĨ¤ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻā§āĻļāύ āĻāĻŋāĻā§āĻā§āώāĻŖ āĻĒāϰ⧠āĻĻā§āĻāĻž āϝāĻžāĻŦā§ :Â
repositories/book.go
package repositories
import (
"Go-bootcamp/pkg/domain"
"Go-bootcamp/pkg/models"
"gorm.io/gorm"
)
type bookRepo struct {
db *gorm.DB
}
func BookDBInstance(d *gorm.DB) domain.IBookRepo {
return &bookRepo{
db: d,
}
}
func (repo *bookRepo) GetBooks(bookID uint) []models.Book
func (repo *bookRepo) CreateBook(book *models.Book) error
func (repo *bookRepo) UpdateBook(book *models.Book) error
func (repo *bookRepo) DeleteBook(bookID uint) error
āĻāĻĒāϰā§āĻā§āϤ āĻā§āĻĄā§ āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻāĻŋ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ ā§Ē āĻāĻŋ āĻĢāĻžāĻāĻļāύāĻā§ bookRepo āĻāϰ āĻŽā§āĻĨāĻĄ āĻšāĻŋāϏā§āĻŦā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āĻāĻāĻžā§āĻžāĻ āϝā§āĻšā§āϤ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ models/book.go āĻāϰ Book Struct āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϞāĻžāĻāĻŦā§ āϏā§āϤāϰāĻžāĻ “Go-bootcamp/pkg/models” āĻ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāύā§āϝ “gorm.io/gorm” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤Â
[ā§Ž.ā§Ē.⧧⧍] āϏāĻžāϰā§āĻāĻŋāϏ āĻĢāĻžāĻāĻļāύāĻā§āϞā§āϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ
āĻāϤā§āĻŽāϧā§āϝā§āĻ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āϏāĻžāĻĨā§ IBookRepo āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄ āĻāϰ⧠āĻĢā§āϞā§āĻāĻŋ āĻāĻŽāϰāĻžāĨ¤ āϏā§āϤāϰāĻžāĻ āϏāĻžāϰā§āĻāĻŋāϏā§āϰ āĻāύā§āϝ IBookService āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄ āĻāϰāĻžāĻāĻž āĻāĻ āĻŋāύ āĻāĻŋāĻā§ āĻšāĻŦā§ āύāĻžāĨ¤ āĻāĻāĻžāύ⧠āĻāĻŦāĻžāϰ āĻāĻāĻā§ āĻŽāĻžāĻĨāĻž āĻāĻžāĻāĻžāĻŦā§ āĻāĻŽāϰāĻž –Â
āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻāύā§āϝ *gorm.DB āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āĻ āĻŦāĻā§āĻā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāĻŽāϰāĻž āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄ āĻāϰā§āĻāĻŋāϞāĻžāĻŽ āĻā§āύāύāĻž āĻāĻāĻžāύ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻāĻžāĻ āĻāĻŋāϞ āĻĄāĻžāĻāĻžāĻŦā§āϏ āύāĻŋā§ā§āĨ¤ āϤāĻžāĻšāϞ⧠āϏāĻžāϰā§āĻāĻŋāϏ āĻĨā§āĻā§ āĻāĻŽāϰāĻž āϝā§āĻšā§āϤ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻāϞ āĻāϰāĻŦā§, āϏā§āĻšā§āϤ⧠āĻāĻāĻžāύ⧠āĻāĻŽāϰāĻž IBookService āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋ IBookRepo āĻāϰ āϏāĻžāĻĨā§ āĻŦāĻžāĻāύā§āĻĄ āĻāϰ⧠āĻĻā§āĻŦā§āĨ¤ āĻāϤ⧠āĻāϰ⧠āĻāĻŽāϰāĻž āϏāĻžāϰā§āĻāĻŋāϏ āĻĨā§āĻā§ IBookRepo āĻāϰ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§ āϝāĻž repositories/book.go āĻ āĻāĻā§āĨ¤ āĻāĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/domain” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤Â
āϤāĻžāĻšāϞ⧠āĻļā§āϰ⧠āĻāϰāĻž āϝāĻžāĻ āϏāĻžāϰā§āĻāĻŋāϏ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ :Â
type BookService struct {
repo domain.IBookRepo
}
func BookServiceInstance(bookRepo domain.IBookRepo) domain.IBookService {
return &BookService{
repo: bookRepo,
}
}
- āĻāĻĒāϰā§āĻā§āϤ āĻā§āĻĄā§ āĻāĻŋ āĻšā§ā§āĻā§ āĻāĻž āϧāĻžāĻĒā§ āϧāĻžāĻĒā§ āĻŦā§āĻāĻŋā§ā§ āĻĻāĻŋāĻā§āĻāĻŋ –Â
- āĻĒā§āϰāĻĨāĻŽāϤ āĻāĻāĻāĻŋ Struct āύā§ā§āĻž āĻšā§ā§āĻā§, BookService āύāĻžāĻŽā§, āϝāĻžāϰ āĻā§āϤāϰ⧠āĻāĻāĻāĻŋ āĻĢāĻŋāϞā§āĻĄ repo āϰāĻžāĻāĻž āĻšā§ā§āĻā§ āϝāĻž domain.IBookRepo āĻāĻžāĻāĻĒāĨ¤
- āĻĒāϰāĻŦāϰā§āϤ⧠āϧāĻžāĻĒā§ BookServiceInstance() āĻĢāĻžāĻāĻļāύ⧠āĻŦāĻžāĻāϰ⧠āĻĨā§āĻā§ āĻā§āύ⧠domain.IBookRepo āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻāϏāĻžāϰ āĻĒāϰ āϤāĻž BookService āĻāϰ repo āϤ⧠āϰā§āĻā§ āϰāĻŋāĻāĻžāϰā§āύ āĻāĻžāĻāĻĒā§ domain/book.go āĻāϰ IBookService āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋ āĻĻā§ā§āĻž āĻšā§ā§āĻā§āĨ¤
- āĻāĻāĻž āĻāϰāĻžāϰ āϏāĻžāĻĨā§ āϏāĻžāĻĨā§āĻ āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§ āĻĒā§āϰ⧠āĻĢāĻžāĻāĻļāύāĻāĻžā§ āĻāϰāϰ āĻĻā§āĻāĻžāĻā§āĻā§āĨ¤ āĻāĻžāϰāĻŖ, āĻāĻāύ āĻāĻ BookService āĻ āĻŦāĻā§āĻā§āĻā§āϰ āϏāĻžāĻĨā§ āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋāϰ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻšā§ā§ āĻāĻŋā§ā§āĻā§ āĻāĻŦāĻ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻ āĻŦāĻā§āĻā§āĻāĻāĻŋāϰ āĻŽā§āĻĨāĻĄ āĻšāĻŋāϏā§āĻŦā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āύāĻž āĻāϰāĻž āĻĒāϰā§āϝāύā§āϤ āĻāĻ āĻāϰāϰ āĻĻā§āĻāĻžāϤ⧠āĻĨāĻžāĻāĻŦā§āĨ¤
- āĻāĻāύ āĻāĻŽāϰāĻž āĻĢāĻžāĻāĻļāύāĻā§āϞā§āϰ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻā§āĻļāύ āĻĻā§āĻāϤ⧠āĻĒāĻžāĻŦā§āĨ¤ āĻŦāĻŋāϏā§āϤāĻžāϰāĻŋāϤ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻā§āĻļāύ āĻāĻŋāĻā§āĻā§āώāĻŖ āĻĒāϰ⧠āĻĻā§āĻāĻž āϝāĻžāĻŦā§ :Â
service/book.go
package services
import (
"Go-bootcamp/pkg/domain"
"Go-bootcamp/pkg/models"
"Go-bootcamp/pkg/types"
)
type BookService struct {
repo domain.IBookRepo
}
func BookServiceInstance(bookRepo domain.IBookRepo) domain.IBookService {
return &BookService{
repo: bookRepo,
}
}
func (service *BookService) GetBooks(bookID uint) ([]types.BookRequest, error)
func (service *BookService) CreateBook(book *models.Book) error
func (service *BookService) UpdateBook(book *models.Book) error
func (service *BookService) DeleteBook(bookID uint) error
āĻāĻĒāϰā§āĻā§āϤ āĻā§āĻĄā§ āĻāĻŽāϰāĻž āĻĻā§āĻāϤ⧠āĻĒāĻžāĻā§āĻāĻŋ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ ā§Ē āĻāĻŋ āĻĢāĻžāĻāĻļāύāĻā§ BookService āĻāϰ āĻŽā§āĻĨāĻĄ āĻšāĻŋāϏā§āĻŦā§ āĻāĻŽāĻĒā§āϞāĻŋāĻŽā§āύā§āĻ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āĻāĻāĻžā§āĻžāĻ āϝā§āĻšā§āϤ⧠āϰā§āϏāĻĒāύā§āϏā§āϰ āĻāĻžāĻ āĻāϰāĻžāϰ āĻāύā§āϝ types/structures.go āĻāϰ BookRequest Struct āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϞāĻžāĻāĻŦā§ āĻāĻŦāĻ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻĢāĻžāĻāĻļāύāĻā§āϞā§āϤ⧠āĻĒāĻžāϏ āĻāϰāĻžāϰ āĻāύā§āϝ models/book.go āĻāϰ Book Struct āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āϞāĻžāĻāĻŦā§ āϏā§āϤāϰāĻžāĻ “Go-bootcamp/pkg/types” āĻ “Go-bootcamp/pkg/models” āĻĒā§āϝāĻžāĻā§āĻ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§āĨ¤Â
[ā§Ž.ā§Ē.ā§§ā§Š] āĻāύā§āĻā§āϰā§āϞāĻžāϰ⧠āϏāĻžāϰā§āĻāĻŋāϏ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ
āĻāĻā§āϰ āĻ āĻāĻļā§āϰ āĻāĻŽāϰāĻž āĻĻā§āĻā§āĻāĻŋ, IBookRepo āĻāϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻāĻŋāĻāĻžāĻŦā§ āϏāĻžāϰā§āĻāĻŋāϏ⧠āύāĻŋā§ā§ āϤāĻžāϰ āϏāĻžāĻĨā§ IBookService āĻāύā§āĻāĻžāϰāĻĢā§āϏāĻāĻŋ āĻŦāĻžāĻāύā§āĻĄ āĻāϰāĻž āĻšā§ā§āĻā§āĨ¤ āĻāϤ⧠āĻāϰ⧠āĻāĻŽāϰāĻž āĻĒāϰāĻŦāϰā§āϤā§āϤ⧠āĻā§āĻĄ āĻāϰāĻžāϰ āϏāĻŽā§ āϏāĻžāϰā§āĻāĻŋāϏ āĻĨā§āĻā§ IBookRepo āĻāϰ āĻĢāĻžāĻāĻļāύāĻā§āϞ⧠āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦā§ āϝāĻž repositories/book.go āĻ āĻāĻā§āĨ¤ āĻāĻāĻāĻāĻžāĻŦā§ āĻāĻŽāĻžāĻĻā§āϰ āϏāĻžāϰā§āĻāĻŋāϏ āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻ āĻāĻāĻāĻŋ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻāύā§āĻā§āϰā§āϞāĻžāϰ⧠āĻĒā§āϰā§ā§āĻāύ, āϝāĻžāϤ⧠controllers/book.go āĻĨā§āĻā§ āĻāĻŽāϰāĻž āϏāĻžāϰā§āĻāĻŋāϏā§āϰ āĻĢāĻžāĻāĻļāύāĻā§āϞā§āĻā§ āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŋāĨ¤ āĻāĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/domain” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāĻž āϞāĻžāĻāĻŦā§ :Â
controller/book.go
var BookService domain.IBookService
func SetBookService(bService domain.IBookService) {
BookService = bService
}
āĻāĻāύ āĻāĻŽāϰāĻž āϏāĻžāϰā§āĻāĻŋāϏā§āϰ āϏāĻāϞ āĻĢāĻžāĻāĻļāύ BookService āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāϞ āĻāϰāϤ⧠āĻĒāĻžāϰāĻŦ āĨ¤
[ā§Ž.ā§Ē.ā§§ā§Ē] āĻĢā§āϰāϤ āϝāĻžāĻ container āĻ
- āĻāĻŽāĻžāĻĻā§āϰ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻā§āĻŦāĻŋāϞ āϤā§āϰāĻŋāϰ āϏāĻŦāĻāĻŋāĻā§ connection/connection.go āϤ⧠āĻĨāĻžāĻāϞā§āĻ āĻāĻŽāϰāĻž āĻāĻŋāύā§āϤ⧠āĻā§āĻĨāĻžāĻ āĻĨā§āĻā§ āϤāĻž āĻāϞ āĻāϰāĻŋāύāĻŋ āĻ āϰā§āĻĨāĻžā§ āĻĄāĻžāĻāĻžāĻŦā§āϏā§āϰ āĻā§āύ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ āĻāϰāĻŋāύāĻŋāĨ¤ āĻāĻžāϰāĻŖ, āϝāĻāύ āĻāĻŽāϰāĻž connection/connection.go āĻāϰ āĻāĻžāĻ āĻļā§āώ āĻāϰā§āĻāĻŋāϞāĻžāĻŽ āϤāĻāύ⧠āĻĄāĻžāĻāĻžāĻŦā§āϏ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšāĻā§āĻāĻŋāϞ āύāĻž āĻā§āĻĨāĻžāĻāĨ¤ āĻāĻŽāϰāĻž āĻāĻžāύāĻŋ, āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻž āĻāϰ⧠āĻā§āύ⧠āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻĢā§āϞ⧠āϰāĻžāĻāĻž āϝāĻžā§āύāĻž Go āϤā§āĨ¤Â   Â
āĻāĻā§āĻ āĻŦāϞā§āĻāĻŋāϞāĻžāĻŽ āĻāĻŽāϰāĻž āĻĢāĻŋāϰ⧠āĻāϏāĻŦ containers/serve.go āϤ⧠:Â
-  āϝāĻāύ āĻāĻŽāϰāĻž *gorm.DB āĻāϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏā§āϰ āϏāĻžāĻĨā§ repositories/book.go āĻ IBookRepo āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄ āĻāϰā§āĻāĻŋāϞāĻžāĻŽ BookDBInstance() āĻĢāĻžāĻāĻļāύā§āϰ āĻĻā§āĻŦāĻžāϰāĻž, āϤāĻāύ āϏā§āĻāĻžāύ⧠*gorm.DB āĻāϰ āĻāĻāĻāĻŋ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϰāĻŋāϏāĻŋāĻ āĻāϰā§āĻāĻŋāϞāĻžāĻŽāĨ¤ āĻāĻŋāύā§āϤ⧠āϏā§āĻāĻž āĻā§āĻĨāĻž āĻĨā§āĻā§ āĻāϏāĻāĻŋāϞ⧠āϤāĻž āĻāĻžāύāĻž āĻāĻŋāϞ āύāĻžāĨ¤
- āĻāĻ āĻŽā§āĻšā§āϰā§āϤ⧠Serve() āĻĢāĻžāĻāĻļāύ⧠āĻāĻŽāϰāĻž *gorm.DB āĻāϰ āĻāĻāĻāĻŋ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϤā§āϰāĻŋ āĻāϰāĻŦā§ (āϝāĻžāϰ āĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/connection” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§) āĻāĻŦāĻ āϏā§āĻāĻž repositories/book.go āĻāϰ BookDBInstance() āĻĢāĻžāĻāĻļāύ⧠āĻĒāĻžāĻ āĻžāĻŦā§ āĨ¤ āĻāĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/repositories” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§ –Â
db := connection.GetDB()
bookRepo := repositories.BookDBInstance(db)
repositories/book.go āϤ⧠*gorm.DB āĻāϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āĻĒāĻžāĻ āĻžāύā§āϰ āĻāĻžāĻ āĻļā§āώāĨ¤ āĻāĻŽāϰāĻž āϰāĻŋāĻāĻžāϰā§āύ āĻšāĻŋāϏā§āĻŦā§ IBookRepo āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄ āĻāϰāĻž āĻ āĻŦāϏā§āĻĨāĻžā§ āĻĒā§ā§ā§āĻāĻŋ āĻāĻŦāĻ āϏā§āĻāĻž bookRepo āϤ⧠āϏā§āĻā§āϰ āĻāϰā§āĻāĻŋāĨ¤
 āĻāĻŦāĻžāϰ āĻāϏāĻŋ āϏāĻžāϰā§āĻāĻŋāϏā§āϰ āĻā§āώā§āϤā§āϰā§āĨ¤ services/book.go āϤ⧠āĻāĻŽāϰāĻž BookServiceInstance() āĻĢāĻžāĻāĻļāύ⧠āĻāĻāĻāĻŋ IBookRepo āĻāύā§āĻāĻžāϰāĻĢā§āϏā§āϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϰāĻŋāϏāĻŋāĻ āĻāϰā§āĻāĻŋāϞāĻžāĻŽāĨ¤ āĻāĻāύ āĻāĻŽāϰāĻž āĻāĻā§āϰ āϞāĻžāĻāύ⧠āϰāĻŋāĻāĻžāϰā§āύ āĻĒāĻžāĻā§āĻž IBookRepo āĻāϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ bookRepo āĻā§ services.BookServiceInstance() āĻĢāĻžāĻāĻļāύ⧠āĻĒāĻžāϏ āĻāϰ⧠āĻĻā§āĻŦā§āĨ¤ āĻāĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/services” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§āĨ¤ āύāĻŋāĻā§āϰ āĻā§āĻĄāĻāĻŋ āĻĻā§āĻāϞ⧠āĻāϰā§āĻāĻā§ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āĻšāĻŦā§ āĻŦā§āϝāĻžāĻĒāĻžāϰāĻāĻž –
bookRepo := repositories.BookDBInstance(db)
bookService := services.BookServiceInstance(bookRepo)
   3. āϏāĻŦāĻļā§āώā§, Serve() āĻ āĻĒā§āϰāĻžāĻĒā§āϤ IBookService āĻāϰ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ bookService āĻā§Â controllers/book.go āĻāϰ SetBookService() āϤ⧠āĻĒāĻžāĻ āĻŋā§ā§ āĻĻā§āĻŦā§ āϝā§āĻāĻž āϏāĻžāϰā§āĻāĻŋāϏā§āϰ āĻāύā§āĻāĻžāϰāĻĢā§āϏ āĻŦāĻžāĻāύā§āĻĄāĻŋāĻ āĻāϰ āĻāĻāĻāĻŋ āĻāύā§āϏāĻā§āϝāĻžāύā§āϏ āϰāĻŋāϏāĻŋāĻ āĻāϰāĻžāϰ āĻāύā§āϝ āϰā§āĻā§āĻāĻŋāϞāĻžāĻŽāĨ¤ āĻāĻāύā§āϝ āĻāĻŽāĻžāĻĻā§āϰ “Go-bootcamp/pkg/controllers” āĻĒā§āϝāĻžāĻā§āĻāĻāĻŋ āĻāĻŽāĻĒā§āϰā§āĻ āĻāϰāϤ⧠āĻšāĻŦā§ –Â
bookRepo := repositories.BookDBInstance(db)
bookService := services.BookServiceInstance(bookRepo)
controllers.SetBookService(bookService)
   4. āϤāĻžāĻšāϞ⧠āĻāĻŽāĻžāĻĻā§āϰ āĻĢāĻžāĻāύāĻžāϞ āĻā§āĻĄāĻāĻŋ āĻĻāĻžāĻā§āĻžāĻā§āĻā§ :
containers/server.go
package containers
import (
"fmt"
"Go-bootcamp/pkg/config"
"Go-bootcamp/pkg/connection"
"Go-bootcamp/pkg/controllers"
"Go-bootcamp/pkg/repositories"
"Go-bootcamp/pkg/routes"
"Go-bootcamp/pkg/services"
"log"
"github.com/labstack/echo/v4"
)
func Serve(e *echo.Echo) {
config.SetConfig()
db := connection.GetDB()
bookRepo := repositories.BookDBInstance(db)
bookService := services.BookServiceInstance(bookRepo)
controllers.SetBookService(bookService)
routes.BookRoutes(e)
log.Fatal(e.Start(fmt.Sprintf(":%s", config.LocalConfig.Port)))
}
  5. āĻāĻāĻžāύā§āĻ āĻāĻŽāĻžāĻĻā§āϰ container/serve.go āĻāϰ āĻāĻžāĻ āĻļā§āώāĨ¤ āĻāĻŽāϰāĻž āĻāϰ āĻĢā§āϰāϤ āĻāϏāĻŦ āύāĻž āĻāĻ āĻĒā§āϝāĻžāĻā§āĻā§, āĻāĻĨāĻž āĻĻāĻŋāĻā§āĻāĻŋ…Â