
Go
文章平均质量分 91
落雨便归尘
大三在读,爱cpp,爱go,爱后端,爱生活
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
RPC入门教学(一) ———— RPC介绍与protobuf的介绍与使用
RPC(Remote Procedure Call,远程过程调用)是一种允许程序调用另一台计算机上的子程序或函数的协议,而无需程序员显式地进行底层网络编程。RPC的目标是让开发者在编写分布式应用时,可以像调用本地函数一样简单地调用远程服务,隐藏了网络通信的复杂性。gRPC(Google Remote Procedure Call)是Google开发的一个高性能、开源和通用的远程过程调用(RPC)框架。它旨在使客户端能够像调用本地对象一样轻松地调用不同服务器上的远程服务,从而简化分布式应用和服务的构建。原创 2024-12-23 18:24:48 · 1335 阅读 · 0 评论 -
go并发编程——如何设计一个协程安全的数据结构
我们在编写代码的时候常常需要用到数据结构来存储代码,而在并发编程中,这一部分上的代码就会称为我们常常所说的临界区,如何正确的访问临界资源,成为了我们需要考虑的问题之一,而今天我们将通过实现一个协程安全的map来探索我们在并发编程设计时,如何去设计一个协程安全的数据结构在本文中我们主要会使用三种方法来实现这个map,分别是:首先我们来看一下结构体代码:如上我们实现了一个的结构体,它里面我们利用Channel实现了一个类似于锁的机制,我们通过控制的大小来控制map在同一时间可访问协程的数量,实现了类似于互斥锁原创 2024-12-21 20:06:32 · 1086 阅读 · 0 评论 -
go语言后端开发学习(七)——如何在gin框架中集成限流中间件
上面就是一些常见的限流策略,虽然说现在限流策略已经不再是单体架构而是迈向分布式,但是万变不离其宗,主要还是基于上面所说的策略进行拓展李文周博客——常用限流策略——漏桶与令牌桶介绍。原创 2024-09-14 23:55:17 · 1628 阅读 · 1 评论 -
redis学习笔记 ——redis中的四大特殊数据结构
Bitmap(位图),是一串连续的二进制数组(0和1),可以通过偏移量(offset)定位元素,通过对最小单位bit进行0|1的设置来表示某个元素的值或者状态,由于 bit 是计算机中最小的单位,使用它进行储存将非常节省空间,特别适合一些数据量大且使用二值统计的场景。Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。原创 2024-08-28 01:21:07 · 1442 阅读 · 0 评论 -
redis实战——go-redis的使用与redis基础数据类型的使用场景(二)
缓存对象做购物车首先是缓存对象,hash命令中的keyvaluefiled很好的能够对应对象的结构我们可以利用Hash来缓存结构,比如像下面我写了一个json那购物车我们应该怎么做呢?原创 2024-08-23 17:51:37 · 1116 阅读 · 0 评论 -
redis实战——go-redis的使用与redis基础数据类型的使用场景(一)
在之前的文章我们介绍了redis的五大基础数据结构以及一些操作这些数据结构,而用原生命令在我们日常开发的过程中当然是不可能的,本文我们所要探究的就是如何基于go语言实现对redis数据库的操作以及不同的数据结构所使用的场景。原创 2024-08-22 21:21:06 · 1082 阅读 · 0 评论 -
go语言后端开发学习(四) —— 在go项目中使用Zap日志库
本文详细介绍了如何在Go项目中集成并配置Zap日志库。首先通过`go get -u go.uber.org/zap`命令安装Zap,接着展示了`Logger`与`Sugared Logger`两种日志记录器的基本用法。随后深入探讨了Zap的高级配置,包括如何将日志输出至文件、调整时间格式、记录调用者信息以及日志分割等。最后,文章演示了如何在gin框架中集成Zap,通过自定义中间件实现了日志记录和异常恢复功能。通过这些步骤,读者可以掌握Zap在实际项目中的应用与定制方法原创 2024-08-11 20:14:32 · 1383 阅读 · 0 评论 -
go语言后端开发学习(六) ——基于雪花算法生成用户ID
本文介绍了分布式ID生成中的Snowflake(雪花)算法。为解决用户ID安全性与唯一性问题,Snowflake算法生成的ID具备全局唯一性、递增性、高可用性和高性能性等特点。64位ID由符号位(固定为0)、41位时间戳、10位标识位(含数据中心与机器ID)及12位序列号组成。面对ID重复风险,可通过预分配、动态或统一分配标识位解决。Go语言实现示例展示了如何使用第三方包`sonyflake`生成ID,确保不同节点产生的ID始终唯一。原创 2024-08-14 17:26:28 · 1233 阅读 · 0 评论 -
go语言后端开发学习(五)——如何在项目中使用Viper来配置环境
Viper 是一个强大的 Go 语言配置管理库,适用于各类应用,包括 Twelve-Factor Apps。相比仅支持 `.ini` 格式的 `go-ini`,Viper 支持更多配置格式如 JSON、TOML、YAML 等原创 2024-08-13 16:27:17 · 1596 阅读 · 0 评论 -
go语言后端开发学习(三)——基于validator包实现接口校验
在讲解validatorgorm.Model在博客中我设置了两种角色管理员(role=1)与普通用户(role=2),而这也造成了一个问题:我们在添加用户按照正常业务情况是不能直接在前台创建管理员,而这个就需要我们在后端进行参数校验了(备注:其实参数校验这件事前后端都是要做的,但是我们这里介绍主要是后端,就以后端视角来介绍了),而接下来我们以给这个用户模块做参数校验为例,来介绍一下我们如何来实现参数校验以及一些其他的相关操作。原创 2024-06-10 20:43:26 · 1085 阅读 · 0 评论 -
go语言后端开发学习(二)——基于七牛云实现的资源上传模块
在之前的文章中我介绍过我们基于gin框架怎么实现本地上传图片和文本这类的文件资源(具体文章可以参考),但是在我们实际上的项目开发中一般却是不会使用本地上传资源的方式来上传的,因为文件的上传与读取会频繁进行磁盘读写,会造成资源的不必要浪费,所以我们一般会寻找第三方平台来托管我们的一些文件资源,而这也就是我们今天的主题——。原创 2024-06-08 03:15:33 · 1271 阅读 · 0 评论 -
go语言后端开发学习(一)——JWT的介绍以及基于JWT实现登录验证
在RFC标准中,JWTHeader: 头部Payload: 载荷Signature: 签名我们会将这里的每一个部分用一个点而这就是一个JWT令牌的标准结构,接下来网格大家来逐个讲解每个结构的作用。// JWT结构体JWTKey []byte // JWT密钥func NewJWT() *JWT { //新建JWT结构体// 自定义声明Username string `json:"username"` //这里的与gorm中声明的保持一致// 定义相关错误信息var (原创 2024-06-05 12:54:08 · 1672 阅读 · 1 评论 -
go语言并发编程(五) ——Context
Context是go语言中所提供的一种并发控制的解决方案,相比于管道与WaitGroupContext可以更好的控制子孙协程以及层次更深的协程。ContextemptyCtxcancelCtxtimerCtxvalueCtx在看Context的具体实现之前,先来看看Context接口的定义.Deadline该方法有两个返回值,deadline是截止时间,也就是上下文截止的时间,第二个值是是否设置deedline,如果没有则一直为falseDone。原创 2024-04-15 16:50:55 · 1085 阅读 · 0 评论 -
go语言并发编程(四) ——再探管道
双向管道可以转换为单向管道,反过来则不可以。通常情况下,将双向管道传给某个协程或函数并且不希望它读取/发送数据,就可以用到单向管道来限制另一方的行为。// 只能对管道发送数据ch <- 1当然读管道同理select在Linux系统中一般用于IO多路复用,类似的,在Go语言中,select是一种管道多路复用的控制结构,而到底什么是多路复用,简单的用一句话来概括的话就是:在某一时刻,同时监测多个元素是否可用,而被监测的可以是网络请求,文件IO等,而在Go语言中的select。原创 2024-04-13 15:59:08 · 1634 阅读 · 1 评论 -
Go语言并发编程(三)——初窥管道
go语言对管道作用的解释是这样的:通过消息实现内存共享,channel就是为此而生的,与c++实现并发编程中利用共享内存进行多线程/进程通信不同,go语言通道的思想就是协程与协程之间并不创建实质上的共享,而是基于管道的通信,实现多个协程之间共享内存。在Go语言中,我们会通过关键字chan来声明一个管道,同时我们也要指定其存储的数当然这只是一个管道的声明,此时管道还没有初始化,其值为nil。原创 2024-04-12 14:27:49 · 893 阅读 · 0 评论 -
go语言并发编程(二)——锁
在介绍锁之前我们要先明确一件事情,我们要知道锁的本质其实是将原本并行的操作变成串行操作,这样不可避免的会造成不必要的资源浪费,而在我们使用互斥锁的时候,如果读写操作的数量趋于一致的时候,我们可以使用互斥锁,但是读写操作的数量差距较大时,使用互斥锁将会造成大量的浪费,这时后我们就可以使用我们今天的主角——读写锁了。获得读锁:当一个协程获得读锁时,其他协程进行写操作时会阻塞,其他协程进行读操作时不会阻塞获得写锁:当一个协程获得写锁时,其他协程进行写操作时会阻塞,其他协程进行读操作时。原创 2024-04-08 20:21:22 · 1071 阅读 · 0 评论 -
Go语言并发(一)——goroutine与Waitgroup
协程是轻量级的线程(或者说是用户态的线程),与常用的线程不同的是,它本身的调度不由操作系统来完成,而是由go语言本身所带的调度器来完成,进而减少了上下文切换的开销,这也是go语言性能提升的原因。WaitGroup是Go语言中一个并发控制工具,它由sync包提供,WairGroup即等待执行,我们可以利用它轻易的实现等待一组协程的效果。原创 2024-04-08 16:19:27 · 1006 阅读 · 0 评论 -
Go语言进阶篇——文件
文件的常见的两种打开方式是基于os相对于前者,OpenFile可以提供更加细致的操作,而前者就是对后者的一个简单封装文件的查找路径默认为项目go.mod文件所在的路径,由于项目下并没有该文件,所以自然会返回一个错误。因为IO错误的类型有很多,所以有时后需要我们去手动的去判断文件是否存在,而os事实上第一种函数读取的文件仅仅只是只读的,无法被修改,Open函数内部实现通过OpenFile函数可以控制更多细节,例如修改文件描述符和文件权限,关于文件描述符,os包下提供了以下常量以供使用。原创 2024-02-26 21:30:31 · 800 阅读 · 0 评论 -
Go语言进阶篇——泛型
想自己手写出一个自己的数据结构吗,想让它上面类型都可以往里面塞吗,泛型来带你飞,抓稳了,要发车了!!!!原创 2024-02-22 00:37:41 · 2548 阅读 · 0 评论 -
go语言进阶篇——面向对象(一)
如何利用go语言实现简短的面向对象?老司机带你上路!!!!!原创 2024-02-07 23:54:18 · 1683 阅读 · 2 评论 -
go语言进阶篇——接口
接口是一个非常重要的概念,它描述了一组抽象的规范,但是并不提供具体的实现。对于项目而言可以根据接口使代码可读性更高,使开发更简单,代码风格也会在这期间主键线程规范,这也是我们所推崇的面向接口编程。原创 2024-02-04 17:20:15 · 1137 阅读 · 0 评论 -
Go语言进阶篇——浅谈函数中的闭包
从内存角度看闭包,捕获变量?堆栈使用?一文即明原创 2024-01-31 18:47:24 · 1645 阅读 · 1 评论 -
go基础语法结束篇 ——函数与方法
Go语言面向对象学习前最后的准备工作,基础知识,一网打尽!!!!原创 2024-01-30 23:17:10 · 1119 阅读 · 1 评论 -
Go语言入门之路——数据结构
Go语言入门攻略,万字张文,go语言基本数据结构,一文即可!!!!原创 2024-01-28 20:05:12 · 817 阅读 · 1 评论 -
go语言入门之路——基础语法
适合有简单代码人群食用,转Go学习Go的最快攻略!!!!!!原创 2024-01-26 13:06:41 · 975 阅读 · 1 评论