在我的客服系统项目中,我使用的gin框架没有自带session功能,需要经过下面的整合处理 使用的是 github.com/gin-contrib/sessions 在我的tools包下 package tools import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" ) // 中间件,处理sessi…
在我的客服系统项目中,我使用的gin框架没有自带session功能,需要经过下面的整合处理 使用的是 github.com/gin-contrib/sessions 在我的tools包下 package tools import ( "github.com/gin-contrib/sessions" "github.com/gin-contrib/sessions/cookie" "github.com/gin-gonic/gin" ) // 中间件,处理sessi…
proto是在当今使用最广泛的IDL之一,起因是dubbo3的Triple 协议需要用到proto文件来生成统一规范的跨语言代码,Grpc也有类似的问题,想想一个团队有很多的业务模块,涉及到一些相互调用依赖的问题,如 A模块需要用到B模块的接口,就需要找到B模块开发者,请告知一下 B模块相关的proto文件是哪些,我需要copy到A模块来生成客户端调用代码,虽说这个场景单看起来条理是清晰的,后续如果越来越多的模块需要相互引用依赖,版本变更 ,昨天提供给你的proto文件 今天已经被提供者加了字段 或者删减了字段,需…
所有人都听过这样一个歌谣:从前有座山,山里有座庙,庙里有个和尚在讲故事:从前有座山。。。。,虽然这个歌谣并没有一个递归边界条件跳出循环,但无疑地,这是递归算法最朴素的落地实现,本次我们使用Golang1.18回溯递归与迭代算法的落地场景应用。 递归思想与实现 递归思想并非是鲜为人知的高级概念,只不过是一种相对普遍的逆向思维方式,这一点我们在:人理解迭代,神则体会递归,从电影艺术到Python代码实现神的逆向思维模式中已经探讨过,说白了就是一个函数直接或者间接的调用自己,就是递归,本文开篇和尚讲故事的例子中,和尚不停…
前文再续,上一回我们完成了用户的登录逻辑,将之前用户管理模块中添加的用户账号进行账号和密码的校验,过程中使用图形验证码强制进行人机交互,防止账号的密码被暴力破解。本回我们需要为登录成功的用户生成Token,并且通过Iris的中间件(Middleware)进行鉴权操作。 Iris模板复用 在生成Token之前,首先我们需要对项目的模板进行优化改造,目前存在的页面模板有三块,分别是:首页模板(index.html)、登录页模板(signin.html)、后台用户管理页模板(/admin/user.html),虽然页面并…
作者:耿宗杰 前言 关于pprof的文章在网上已是汗牛充栋,却是千篇一律的命令介绍,鲜有真正实操的,本文将参考Go社区资料,结合自己的经验,实战Go程序的性能分析与优化过程。 优化思路 首先说一下性能优化的一般思路。系统性能的分析优化,一定是从大到小的步骤来进行的,即从业务架构的优化,到系统架构的优化,再到系统模块间的优化,最后到代码编写层面的优化。业务架构的优化是最具性价比的,技术难度相对较小,却可以带来大幅的性能提升。比如通过和同事或外部门沟通,减少了一些接口调用或者去掉了不必要的复杂的业务逻辑,可以轻松提升整…
集群中如果需要主备,可以基于Redis、zk的分布式锁等实现,本文将介绍如何利用Mysql分布式锁进行实现。 背景 集群中如果需要主备,可以基于Redis、zk的分布式锁等实现,本文将介绍如何利用Mysql分布式锁进行实现。 原理 数据库中包含数据字段(此处为Master的主机名)、版本号和上一次更新时间。 Master不断上传自己的心跳,即刷新数据库中的"更新时间"。 上一次更新时间超过了一定时间,则认为Master已Down,则可以抢Master。 抢Master和更新心跳时,版本号+1,要判断…
概述 建议先阅读 goroutine 小节。 Go 箴言: 不要通过共享内存来通信,而要通过通信来共享内存。 goroutine 是 Go 程序并发执行的实体,channel (通道) 则是它们之间的连接,用于多个 goroutine 之间互相通信。通道可以让一个 goroutine 发送特定类型值到另一个 goroutine,每一个通道可以发送数据类型称为通道的 元素类型。 阻塞通道与非阻塞通道 通过关键字 chan + 数据类型 来表明通道数据类型,调用 make() 函数来初始化一个通道。 make() 函数…
概述 Go 支持将多个结构体通过嵌套的方式,组成一个大的结构体,降低了单个结构体复杂度,同时提高了结构体之间组合的灵活性。 例子 为了省略篇幅,本小节只使用 字面量 方式初始化,new() 的初始化方式请参照 结构体 小节。 每个结构体单独初始化,最后组装 package main import ( "fmt" ) type person struct { name string age int16 hobby profession addres…
1. 简介 本文将介绍 Go 语言中的 sync.Cond 并发原语,包括 sync.Cond的基本使用方法、实现原理、使用注意事项以及常见的使用使用场景。能够更好地理解和应用 Cond 来实现 goroutine 之间的同步。 2. 基本使用 2.1 定义 sync.Cond是Go语言标准库中的一个类型,代表条件变量。条件变量是用于多个goroutine之间进行同步和互斥的一种机制。sync.Cond可以用于等待和通知goroutine,以便它们可以在特定条件下等待或继续执行。 2.2 方法说明 sync.Con…
使用Go在微信上搭建ChatGpt机器人 在微信上搭建ChatGpt机器人 项目下载地址:https://www.123pan.com/s/qPtSVv-nX75v 准备 一个服务器:Windos,Centos,Ubuntu 环境:Go 一个微信号用作机器人 一个OpenAI账号 这里我用还是用Centos7为例进行教程,其他系统类似 注册OpenGPT 一瓶可乐钱注册OpenGPT,教程链接:https://blog.ideaopen.cn/index.php/archives/143/ 获取OpenGPT 的A…