跳到主要内容

技巧

  1. 通过具名函数简化代码
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
}
  1. 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"))
}
  1. 优雅的ERROR处理:

优点, 不需要定义ERR变量来返回错误

如果只返回ERR, 那么可以使用如下方式

func Sing(c *gin.Context){
var body struct {...}

if c.Bind(&body) != nil {
...
}
  1. 拼接字符

原本:

c.Header("Authorization", "Bearer " + tokenString)

优雅方式:

c.Header("Authorization", fmt.Sprintf("Bearer %v", tokenString))