Go语言支持链式调用,它是一种编程技术,可以将多个函数或方法连接在一起,以便在一行中完成多个操作。链式调用可以使代码更加简洁、易读,并且可以减少重复的代码。
Go语言中的链式调用是通过将函数或方法的返回值传递到下一个函数或方法中来实现的。例如,假设有一个名为“add”的函数,它可以将两个整数相加并返回其和。如果要将三个整数相加,则可以使用链式调用来实现:
sum := add(1, 2).add(3) // sum = 6
上面的代码中,add() 函数会先将 1 和 2 相加,然后将 3 传递到 add() 函数中并返回最后的和 6。
此外,Go语言也允许在链式调用中使用匿名函数。例如:
(func(x int) int { return x * x }).(func(x int) int { return x + 1 })(2)
上面的代码会首先执行匿名函数 (func(x int) int { return x * x }) (即将 2 的平方作为参数传递到匿名函数中) ;然后再执行 (func(x int) int { return x + 1 }) (即将 4 作为参数传递到匿名函数中并返回 5 ) 。
Model
对象也可以通过TX
事务对象创建,通过事务对象创建的Model
对象与通过DB
数据库对象创建的Model
对象功能是一样的,只不过前者的所有操作都是基于事务,而当事务提交或者回滚后,对应的Model
对象不能被继续使用,否则会返回错误。因为该TX
对象不能被继续使用,一个事务对象仅对应于一个事务流程,Commit/Rollback
后即结束。
为方便事务操作,gdb
提供了事务的闭包操作,通过Transaction
方法实现,该方法定义如下:
func (db DB) Transaction(ctx context.Context, f func(ctx context.Context, tx *TX) error) (err error)
当给定的闭包方法返回的error
为nil
时,那么闭包执行结束后当前事务自动执行Commit
提交操作;否则自动执行Rollback
回滚操作。
如果闭包内部操作产生panic
中断,该事务也将进行回滚。
func Register() error {
return db.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
var (
result sql.Result
err error
)
// 写入用户基础数据
result, err = tx.Table("user").Insert(g.Map{
"name": "john",
"score": 100,
//...
})
if err != nil {
return err
}
// 写入用户详情数据,需要用到上一次写入得到的用户uid
result, err = tx.Table("user_detail").Insert(g.Map{
"uid": result.LastInsertId(),
"phone": "18010576258",
//...
})
return err
})
}
我们也可以在链式操作中通过TX
方法切换绑定的事务对象。多次链式操作可以绑定同一个事务对象,在该事务对象中执行对应的链式操作。
func Register() error {
var (
uid int64
err error
)
tx, err := g.DB().Begin()
if err != nil {
return err
}
// 方法退出时检验返回值,
// 如果结果成功则执行tx.Commit()提交,
// 否则执行tx.Rollback()回滚操作。
defer func() {
if err != nil {
tx.Rollback()
} else {
tx.Commit()
}
}()
// 写入用户基础数据
uid, err = AddUserInfo(tx, g.Map{
"name": "john",
"score": 100,
//...
})
if err != nil {
return err
}
// 写入用户详情数据,需要用到上一次写入得到的用户uid
err = AddUserDetail(tx, g.Map{
"uid": uid,
"phone": "18010576259",
//...
})
return err
}
func AddUserInfo(tx *gdb.TX, data g.Map) (int64, error) {
result, err := g.Table("user").TX(tx).Data(data).Insert()
if err != nil {
return 0, err
}
uid, err := result.LastInsertId()
if err != nil {
return 0, err
}
return uid, nil
}
func AddUserDetail(tx *gdb.TX, data g.Map) error {
_, err := g.Table("user_detail").TX(tx).Data(data).Insert()
return err
}
SVG circle 通过 circle 可以绘制一个圆形,它只有3个属性用来设置圆形。SVG 圆形 - circle circle 标签可用来创建一个圆: 下面...
XSL-FO table-cell 对象XSL-FO 参考手册定义和用法 fo:table-cell 对象是一个包含表格单元格内容的容器。语法fo:table-cell!--Co...
XML Schema element 元素 完整 XML Schema 参考手册定义和用法 element 元素定义一个元素。 元素信息 父元素: schema, choice, ...
XML Schema simpleContent 元素 完整 XML Schema 参考手册定义和用法 simpleContent 元素包含对 complexType 元素(它以字符数据...
XML Schema notation 元素 完整 XML Schema 参考手册 定义和用法 notation 元素描述 XML 文档中非 XML 数据的格式。 元素信息 父...
XSLT xsl:output 元素XSLTxsl:output元素用于定义文档的输出格式,请参考本节中的实例。 完整的 XSLT 元素参考手册定义和用法 xs...
XML DOM baseURI 属性 Element 对象定义和用法 baseURI 属性返回 xml 文档的位置(URI)。 语法elementNode.baseURI 实例 下面的...