技巧
- 通过具名函数简化代码
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))