希曼日记

技巧

  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))