技巧
- 通过具名函数简化代码
func addMoney(
ctx context.Context,
q *Queries,
account1ID int64,
amount1 int64,
account2ID int64,
amount2 int64,
) (account1 Accounts, account2 Accounts, err error) {
account1, err = q.AddAccountBalancer(ctx, AddAccountBalancerParams{
Amount: amount1,
ID: account1ID,
})
if err != nil {
return
}
account2, err = q.AddAccountBalancer(ctx, AddAccountBalancerParams{
Amount: amount2,
ID: account2ID,
})
// 命名的返回值会自动填充, 以下的return就相当于account1, account2, err
// 而且不需要额外的if判断account2与err, 直接返回让外部处理
return
}
不带具名返回值的函数就得这样写, 如果想加空值返回nil还得添加指针返回值:
func addMoney2(
ctx context.Context,
q *Queries,
account1ID int64,
amount1 int64,
account2ID int64,
amount2 int64,
) (Accounts, Accounts, error) {
account1, err := q.AddAccountBalancer(ctx, AddAccountBalancerParams{
Amount: amount1,
ID: account1ID,
})
if err != nil {
return account1, account1, err
}
account2, err := q.AddAccountBalancer(ctx, AddAccountBalancerParams{
Amount: amount2,
ID: account2ID,
})
// 命名的返回值会自动填充, 以下的return就相当于account1, account2, err
if err != nil {
return account1, account1, err
}
return account1, account2, err
}
- init函数
在初始化时先执行的函数, 在执行主main函数, 在数据库初始化连接时非常有用
例:
package database
import (
"context"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
var (
Client *mongo.Client
StartError error
)
func init() {
Client, StartError = mongo.Connect(context.TODO(), options.Client().ApplyURI("mongodb://root:msdnmm@192.168.0.152:27017"))
}
- 优雅的ERROR处理:
优点, 不需要定义ERR变量来返回错误
如果只返回ERR, 那么可以使用如下方式
func Sing(c *gin.Context){
var body struct {...}
if c.Bind(&body) != nil {
...
}
- 拼接字符
原本:
c.Header("Authorization", "Bearer " + tokenString)
优雅方式:
c.Header("Authorization", fmt.Sprintf("Bearer %v", tokenString))