go

sqlx - golang database/sql 的通用扩展

go

go 操作数据库有多种方式,比如之前介绍的 gorm:go gin 封装gorm ,gorm 基本操作 今天介绍的sqlx,是Go的另一个包,它在优秀的内置database/sql包之上提供了一组扩展。 安装 go get github.com/jmoiron/sqlx init package db import ( "fmt" "github.com/jmoiron/sqlx" ) var Conn *sqlx.DB func InitDB() (err error) { dsn := "root:@tcp(127.0.0.1:3306)/ent?charset=utf8m...

gin 全局的异常处理

go

panic类比其他语言中的异常处理 有的人把 Go 中的 panic/recover类比 PHP 中的 throw/try catch,类比 Python 中的raise/try except,类比 Java 中的 throw/try catch 当然也有的人不这么认为。比如:“用户名密码错误”时,在PHP中使用throw语句来抛出异常,大家都觉得很合理,属于“遇到无法处理的错误或异常” 但在Go语言中,"用户名密码错误"这样的预料之中的错误,使用 panic 来处理并不是一个好的选择。panic 适用于无法恢复的严重错误或异常情况,它会立即停止程序执行并触发异常处理机制。而"用户名密码错误"...

gin 模型绑定和验证

go

缺点 无法设置默认值 比如需要分页的接口,页码和条数是非必传的,如果不传页码默认1,条数默认10,但是go-playground/validator/v10做不到 无法同时获取路径参数和(查询参数或正文参数) restful风格的路由中会遇到这个问题,比如:有如下路由 r.GET("/:user_id/category/:category_id/article", myFunc) 请求如下 curl 'localhost:7097/v1/user/0/category/4/article?page=1&max=10' 我该如何用一个模型同时取到category_id,page,max参数呢...

go 检测数据竞争 race

go

Go(从v1.1开始)具有内置的数据竞争检测器,可以使用它来检测潜在的数据竞争。 使用: 运行时检查竟态的命令:go run -race main.go 构建时检查竟态的命令:go build -race main.go 测试时检查竟态的命令:go test -race main.go 总结一下,其实就是race选项其实就是检测数据的安全性的,同时读写(而不是同时读,同时写),等情况。

go 不一样的grpc入门示例

go

之所以说不一样,是因为在这里你看不到.proto文件,当然也无需生成任何代码 之所以这么神奇是我用了buf,它托管了我的.proto文件,并且自动生成了相关代码,详情请移步:https://www.cuiwei.net/p/1679512807 服务端极简示例 下面的示例提供了一个AdminLogin服务 server.go package main import ( "context" blogv1 "go.buf.build/grpc/go/cuiwei/blog/admin/v1" "google.golang.org/grpc" "net" ) type blogServi...

go-zero: not matching destination to scan

go

在用go-zero写一个通过api调用grpc的一个功能 问题还原 错误的返回值 func (m *customCwFlashModel) FindListByPage(ctx context.Context, page, max int64) (resp []*flash.AdminFlashDetailResponse, err error) { 。。。 } 这是一个查询flash列表的自定义模型,flash的定义有三处,分别是model部分、api部分和grpc部分 model部分 这是go-zero通过sql自动生成的 CwFlash struct { Id ...

go mutex的模式

go

mutex 有正常模式和饥饿模式 mutex是golang提供的基础并发原语,可以帮助我们处理多goruntine并发访问共享资源的问题。每个goruntine都要再获取到锁之后才能操作共享资源,完成操作释放锁,保证了共享资源的读写安全性。 但这种方式也可能带来一些问题:一些悲惨的goruntine一直获取不到锁,导致业务逻辑不能继续完整执行,这种问题被称为"饥饿问题" 正常模式 当前的mutex只有一个goruntine来获取,那么没有竞争,直接返回。 新的goruntine进来,如果当前mutex已经被获取了,则该goruntine进入一个先入先出的waiter队列,在mutex被释放后...

gin 使用 Json Web Token(JWT)

go

之前的token验证借助了redis,如果用jwt就不需要了 中间件 cat middlewares/jwt.go package middlewares import ( "enterprise-api/app/models" "enterprise-api/core" "github.com/gin-gonic/gin" ) func JWTAuth(role string) gin.HandlerFunc { return func(c *gin.Context) { signToken := c.Request.Header.Get("Authorization") ...

grpc 实现统一格式的body响应

go

我们写rest api时,统一响应大多是这样的 { "err": 0, "msg": "参数错误",//有错误时非空 "data" : {//没错误时才存在 ... } } 在grpc项目中有些许差异 func Admin2Resetpasswd(ctx context.Context, in *pb.Admin2ResetpasswdRequest) (*pb.Admin2ResetpasswdResponse, error) { if in.AdminId == in.ToAid { return nil, status.Error(codes.Failed...

使用 buf 替代 protoc 生成和管理代码

go

以go为例,下面是所需工具 工具 介绍 安装 protobuf protoc 可执行文件 Install protoc-gen-go 从 proto 文件,生成 .go 文件 Install protoc-gen-go-grpc 从 proto 文件,生成 GRPC 相关的 .go 文件 Install protoc-gen-grpc-gateway 从 proto 文件,生成 grpc-gateway 相关的 .go 文件 Install protoc-gen-openapiv2 从 proto 文件,生成 swagger 所需的json文件 Install ...