单例模式(Singleton Pattern)是比较简单的设计模式之一。属于创建型模式,它提供了一种创建对象的最佳方式。它确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
当需要控制实例数量,节省系统资源时。如 : 初始化配置,初始化数据库连接池、初始化某个全局工具包等。
在项目中我们经常需要操作数据库,并创建对应的数据库连接池,这个连接池应该是全局唯一的,可以避免多个连接池产生大量连接的问题。
package main
import (
"log"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type DBConfig struct {
Host string
Port string
Username string
Password string
Database string
Charset string
}
// 全局变量 MysqlDB
var MysqlDB *gorm.DB
func NewDBPoll(dbConfig DBConfig) error {
// 判断全局变量 MysqlDB 是否为空,如果为空则创建连接池
if MysqlDB == nil {
// 初始化连接池
log.Println("初始化连接池")
dsn := dbConfig.Username + ":" + dbConfig.Password +
"@tcp(" + dbConfig.Host + ":" + dbConfig.Port + ")/" +
dbConfig.Database +
"?charset=" + dbConfig.Charset + "&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
return err
}
MysqlDB = db
}
return nil
}
func main() {
dbConfig := DBConfig{
Host: "localhost",
Port: "3306",
Username: "root",
Password: "root",
Database: "test",
Charset: "utf8mb4",
}
err := NewDBPoll(dbConfig)
if err != nil {
panic(err)
}
log.Println("数据库连接成功 ...1")
// 多次调用 NewDBPoll() ,只会执行一次初始化连接池
err = NewDBPoll(dbConfig)
if err != nil {
panic(err)
}
log.Println("数据库连接成功 ...2")
}