模块规范-gen service
该命令通过分析给定的
logic
业务逻辑模块目录下的代码,自动生成service
目录接口代码
需要注意:
由于该命令是根据业务模块生成service接口,因此只会解析二级目录下的go代码文件,并不会无限递归分析代码文件。以logic目录为例,该命令只会解析logic/xxx/*.go文件。因此,需要logic层代码结构满足一定规范。
不同业务模块中定义的结构体名称在生成的service接口名称时可能会重复覆盖,因此需要在设计业务模块时保证名称不能冲突。
注意**logic/xxx/*.go
**的路径,如果找不到internal/logic的路径,就改一下根目录,一般都是再cd一层。
dao.GfUser.Ctx(ctx).Data(do.GfUser{}).All()
这句话啥意思?什么作用?什么时候用?怎么用?如果是查询的话,必须得用这个吗?
ChatGPT:
dao.GfUser
:这是一个数据访问对象(DAO),用于操作名为GfUser
的数据表。.Ctx(ctx)
:这是链式调用的一部分,用于设置操作的上下文。ctx
是一个context.Context
类型的上下文对象。.Data(do.GfUser{})
:这是链式调用的另一部分,用于设置操作的数据对象。do.GfUser{}
是一个结构体类型,表示要进行操作的数据对象。.All()
:这是链式调用的最后一部分,表示进行全部数据的查询操作。具体解释如下:
dao.GfUser
:表示对名为GfUser
的数据表进行操作的数据访问对象(DAO)。该 DAO 提供了一系列的方法,用于对数据表进行增删改查等操作。.Ctx(ctx)
:通过链式调用的方式,将上下文对象ctx
绑定到数据访问对象上。这样,在执行后续的数据库操作时,可以使用该上下文对象传递额外的信息或控制数据库操作的行为。.Data(do.GfUser{})
:通过链式调用的方式,设置要操作的数据对象。do.GfUser{}
是一个结构体类型,表示要进行操作的数据对象。这个结构体的具体定义可能在代码的其他部分有所说明,它包含了与数据表中列对应的字段,用于进行数据的插入、更新等操作。.All()
:通过链式调用的方式,表示进行全部数据的查询操作。这将返回数据表中的所有记录,以供进一步的处理或返回给调用方。这段代码的作用是在数据访问对象
dao.GfUser
上设置上下文对象ctx
,并设置操作的数据对象为do.GfUser{}
,然后执行全部数据的查询操作。它适用于需要查询数据表中的所有记录的场景。请注意,如果只需要查询数据表中的部分记录,可以使用其他方法,如
One()
(查询一条记录)、Where()
(根据条件查询记录)等。具体使用哪种方法取决于业务需求。并不是所有的查询操作都必须使用.All()
方法。根据具体的需求和业务场景,选择适当的方法来进行查询操作。
Postman发送结构体类型的请求格式
// 图书信息
type BookInformation struct {
Id int ` dc:"book_id" json:"id"`
Name string ` json:"book_name"`
ISBN string `json:"Book_ISBN"`
Translator string `json:"translator"`
Date string ` json:"publish_date"`
Publisher_id int `json:"publisher_Id"`
}
// 修改
// 说明里面已经存在了,我需要先查询出来,再修改
type UpdateReq struct {
g.Meta `path:"/update" tags:"Update_Data" method:"get" summary:"修改图书信息"`
Information BookInformation `json:"Book_Information"`
}
字典类型-gmap
gmap
支持并发安全选项开关,在默认情况下是非并发安全
的,开发者可以选择开启gmap
的并发安全特性(传递初始化开关参数safe
参数值为true
, 必须在初始化时设定,不能运行时动态设定)。如:
m := gmap.New(true)
看一下这种用法:
// 处理数据过程中,为了防止空字段覆盖原始字段,提前设置一个map对象备份(倒腾)
data := gmap.New()
// 不为"",即证明有值,也就是需要修改,其余的不用修改,晕了
if gconv.String(in.Information.Name) != "" {
data.Set("name", in.Information.Name)
}
if gconv.String(in.Information.ISBN) != "" {
data.Set("ISBN", in.Information.ISBN)
}
if gconv.String(in.Information.Translator) != "" {
data.Set("translator", in.Information.Translator)
}
if gconv.String(in.Information.Date) != "" {
data.Set("date", in.Information.Date)
}
if gconv.String(in.Information.Publisher_id) != "" {
data.Set("publisher_id", in.Information.Publisher_id)
}
_, err = g.Model("library").Data(data.Map()).Where("id = 4").Update()
return返回
分三种情况
1. 退出执行,不指定返回值(秃return)
(1) 函数没有返回值
func GetMoney(){
fmt.Println("money")
return
}
func main(){
GetMoney()
}
(2) 函数返回值有变量名
func GetMoney() (_amount int){
_amount = 88
fmt.Println("money: ",_amount)
return
}
func main(){
var amount = GetMoney()
fmt.Println("money: ",amount)
}
在返回值中定义了变量_amount,在函数退出时,可以不用显示的在return后边指定函数返回值,函数调用结束后,自动将之前定义的返回值变量作为这个函数的返回结果。(在函数体中已经赋值了)
2. 退出执行,指定返回值
func GetMoney() (_amount int){
fmt.Println("money: ",_amount)
return 88
}
func main(){
var amount = GetMoney()
fmt.Println("money: ",amount)
}
3. 退出执行,指定返回值和指定默认值
func GetMoney() (_amount int){
_amount = 99 //如果return后面没有指定返回值,就用赋给“返回值变量”的值
fmt.Println("money: ",_amount)
return 88 //如果return后面跟有返回值,就使用return后面的返回值
}
func main(){
var amount = GetMoney()
fmt.Println("money: ",amount)
}
ORM链式操作
ORM链式操作
通过连续的方法调用来构建复杂的查询操作。每个方法调用都会返回一个新的查询对象,可以在该对象上继续调用其他方法来添加更多的查询条件或设置。这种方式使代码更具可读性和可维护性,并且方便地构建灵活和复杂的数据库查询。
使用ORM链式操作,可以根据需求自由地添加、修改或删除查询条件,从而灵活地构建查询逻辑。这种方法尤其适用于需要根据不同的情况构建不同查询的场景,例如根据用户的过滤条件动态生成查询,或者在多个条件下逐步构建复杂的查询操作。
询条件或设置。这种方式使代码更具可读性和可维护性,并且方便地构建灵活和复杂的数据库查询。使用ORM链式操作,可以根据需求自由地添加、修改或删除查询条件,从而灵活地构建查询逻辑。这种方法尤其适用于需要根据不同的情况构建不同查询的场景,例如根据用户的过滤条件动态生成查询,或者在多个条件下逐步构建复杂的查询操作。