上一篇讲了关于go基本的安装、环境搭建、项目搭建和运行,这一篇继续深入;
上一篇参考:使用 vsCode创建GO项目
GO 连接数据库&CRUD
GO 测试方法开发
GO 中的各个组件和java中的各个组件对比(差异性和优缺点)
GO 一定要使用 proto buffer吗?
GO 系统权限控制
GO 服务网格
1.1 go 的传参方式
我们通常使用gin 框架绑定函数创建接口,接口的参数都封装在了gin.Context对象中,通常使用 header用于参数的传递:
const NAME string = "name"
const USER_ID string = "user_id"
func GetParam(c *gin.Context) {
userId := c.GetHeader(USER_ID)
fmt.Println(userId)
name := c.GetHeader(NAME)
fmt.Println(name)
name3, ok := c.GetPostFormArray(NAME)
fmt.Println(name3)
fmt.Println(ok)
}
GetPostFormArray 也可以接收
1.2 go 连接 mysql
连接首先需要配置application.yaml
# database config
database:
driver: ${DATABASE_DRIVER:mysql} #mysql
table-prefix: mydb
mysql-dsn: ${DATABASE_USER:root}:${DATABASE_PASSWORD:password}@tcp(${DATABASE_HOST:localhost}:${DATABASE_PORT:3306})/${DATABASE_NAME:mydb}?charset=utf8mb4&parseTime=True&loc=Local
max-idle-conns: ${DATABASE_MAX_IDLE_CONNS:10}
max-open-conns: ${DATABASE_MAX_OPEN_CONNS:100}
driver/mysql-dsn 用于gorm创建数据库的连接,
gorm 是一个 Go 语言编写的 ORM(Object Relational Mapping,即对象关系映射)库,它使得在 Go 中操作数据库变得更加方便和高效。gorm 提供了简洁的 API 来进行数据库操作,包括创建表、插入数据、查询数据、更新数据和删除数据等。
连接代码如下:
import (
"chapter-1/utils/config"
"github.com/jinzhu/gorm"
)
var gdb *gorm.DB
func CreateDB() (*gorm.DB, error) {
if gdb == nil {
driver := config.GetString("database.driver")
dsn := dsn = config.GetString("database.mysql-dsn")
db, err := gorm.Open(driver, dsn)
if err != nil {
return nil, err
}
db.DB().SetMaxIdleConns(config.GetInt("database.max-idle-conns"))
db.DB().SetMaxOpenConns(config.GetInt("database.max-open-conns"))
db.LogMode(config.GetBool("application.debug"))
gdb = db
}
return gdb, nil
}
1.3 gorm
通过gorm 连接到数据库之后,就可以使用gorm 提供的简洁的 API 来进行数据库操作,
实例service代码:
package service
import (
"chapter-1/moddel"
"chapter-1/utils/orm"
"errors"
"github.com/sirupsen/logrus"
)
func Add(userProject moddel.TestModel) error {
db, err := orm.CreateDB()
if err != nil {
logrus.Errorf("projectList service, orm.CreateDB error on row 17 :%v\n", err.Error())
return errors.New("数据库连接异常")
}
errrr := userProject.Add(db)
return errrr
}
func Update(userProject moddel.TestModel) error {
db, err := orm.CreateDB()
if err != nil {
logrus.Errorf("projectList service, orm.CreateDB error on row 17 :%v\n", err.Error())
return errors.New("数据库连接异常")
}
errrr := userProject.Update(db)
return errrr
}
func Detelete(userId string) error {
db, err := orm.CreateDB()
if err != nil {
logrus.Errorf("projectList service, orm.CreateDB error on row 17 :%v\n", err.Error())
return errors.New("数据库连接异常")
}
userProject := moddel.TestModel{ID: userId}
errrr := userProject.Delete(db)
return errrr
}
func GetById(userId string) ([]moddel.TestModel, error) {
db, err := orm.CreateDB()
if err != nil {
logrus.Errorf("projectList service, orm.CreateDB error on row 17 :%v\n", err.Error())
return nil, errors.New("数据库连接异常")
}
userProject := moddel.TestModel{ID: userId}
ups, err := userProject.RawByUserId(db)
if err != nil {
logrus.Errorf("projectList service, userProject.FindByUserId error on row 24:%v\n", err.Error())
return nil, errors.New("数据库查询异常")
}
if len(ups) == 0 {
return nil, nil
}
return ups, err
}
实例 gorm 代码:
package moddel
import (
"strings"
"github.com/jinzhu/gorm"
)
type TestModel struct {
ID string `json:"id"`
Name string `json:"name"`
}
// 直接使用 gorm 的方法,默认使用gorm创建的表 mydb_test_models
func (this *TestModel) Add(db *gorm.DB) (err error) {
return db.Create(this).Error
}
func (this *TestModel) Update(db *gorm.DB) (err error) {
return db.Save(this).Error
}
func (this *TestModel) Delete(db *gorm.DB) (err error) {
return db.Delete(this).Error
}
func (this *TestModel) FindByUserId(db *gorm.DB) (userProjects []TestModel, err error) {
db = db.Find(&userProjects, "id = ?", this.ID)
return userProjects, db.Error
}
// 这种使用方式,不会使用gorm 默认的表,这里使用 test_1
func (this *TestModel) RawByUserId(db *gorm.DB) (userProjects []TestModel, err error) {
var sql = " select * from test_1 where id=${id} "
sql = strings.Replace(sql, "${id}", this.ID, -1)
db = db.Raw(sql)
db = db.Scan(&userProjects)
return userProjects, db.Error
}
参考:gorm官网连接
2.1 测试文件名称 _go.test 结尾
2.2 测试方法名称 Test 开始
2.3 测试方法参数 t *testing.T
3.1 事务
3.2 切面
3.3 拦截器
3.4