go

sqlx - golang database/sql 的通用扩展

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 全局的异常处理

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

gin 模型绑定和验证

缺点 无法设置默认值 比如需要分页的接口,页码和条数是非必传的,如果不传页码默认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参数呢...

Jupyter Notebook 安装 GO 内核

普通安装 https://github.com/janpfeifer/gonb#linux-and-mac-installation go install github.com/janpfeifer/gonb@latest && go install golang.org/x/tools/cmd/goimports@latest && go install golang.org/x/tools/gopls@latest && gonb --install 接着我用PyCharm/VS Code测试,报错了 fmt: package fmt is not in GOROOT (/usr/loc...

go 检测数据竞争 race

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

go 不一样的grpc入门示例

之所以说不一样,是因为在这里你看不到.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...

微服务链路追踪之Jaeger

在一个微服务分布式架构的系统中,可能存在复杂的、深层的层层服务调用关系,大致如下图 如果某个环节出问题,在海量的日志中定位问题是很痛苦的,于是就有了调用链追踪系统,比较有名的是:Jaeger和Zipkin。本篇文章主要介绍Jaeger Jaeger的组成部分 Instrumentation SDKs: 集成到应用程序和框架中以捕获跟踪数据的库。 从历史上看,Jaeger 项目支持使用各种编程语言编写的自己的客户端库。 它们现在被弃用,取而代之的是 OpenTelemetry Jaeger Agent: Jaeger 代理是一个网络守护程序,用于侦听通过 UDP 从 Jaeger 客户端接收...

gRPC调试工具推荐

在介绍工具之前先说一个情况,就是你用某个工具调试时,会发现,有的项目无需手动导入.proto文件,工具就能列出所有method,有些则不行。这是因为项目注册了反射,先看下怎么注册反射 就是这样,下面开始介绍工具 Postman 这个我觉得是最好的 gRPC UI gRPC的交互式Web用户界面,类似postman 安装 go install github.com/fullstorydev/grpcui/cmd/grpcui@latest 使用 # no TLS cuiwei@weideMacBook-Pro ~ % grpcui -plaintext localhost:9087 gRP...

go-zero: not matching destination to scan

在用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的模式

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