自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(41)
  • 收藏
  • 关注

原创 golang中的错误处理

1、panic当我们执行panic的时候会结束下面的流程:packagemainimport"fmt"funcmain(){fmt.Println("hello")pago,错误处理,error handler,panic,包装器,wrap%v的方式不会包装错误,所以无法追溯到源错误,但往往有时候我们会选择这种方式,而不用%w的方式。%w的方式虽然能包装源错误,但往往我们会通过源错误去做一些处理,假如源错误被修改,那包装这个源错误的相关错误都需要做响应变化。

2022-11-02 14:19:00 473 1

原创 golang中的锁竞争问题

* 更新课件时长的时候上锁,避免出现数据竞争* 判断如果时长小于60秒的话,就报错。但是注意这里fmt.Errorf打印结构c会调用String()方法* 我们看String方法里面,又使用了读锁,避免读取的时候数据被更新

2022-10-27 23:45:18 286

原创 golang中的nil接收器

现在我们要实现一个添加课件的功能,但是添加之前需要验证参数的合法性,所以我们创建了一个Validate方法,我们可能会这么写:

2022-10-23 22:22:27 256

原创 golang中的字符串

在go中rune是一个unicode编码点。我们都知道UTF-8将字符编码为1-4个字节,比如我们常用的汉字,UTF-8编码为3个字节。所以rune也是int32的别名。

2022-10-22 22:50:12 1460

原创 golang中的map

map提供了键值对的无序集合,所有的键都是不重复的。在go中map是基于bmap数据结构的。在内部hash表是一个桶数组,每个桶是一个指向键值对数组的指针。每个桶里面可以保存8个元素。我们可以简化成下面的结构。

2022-10-21 16:06:39 1257

原创 golang中的切片

在go中切片的底层是数组,所以切片的数据连续存储在数组的数据结构中。如果底层的数组满了,切片还需要添加元素的话,底层数组就需要扩容。如果底层数组几乎为空时,就会缩容。

2022-10-20 23:07:08 229

原创 golang中的接口

接口提供了一种指定对象行为的方法。 我们使用接口来创建多个对象可以实现的通用抽象。 Go 接口不同的原因在于它们是隐式的。 没有像 implements 这样的显式关键字来标记对象 A实现了接口B。为了理解接口的强大,我们可以看下标准库中两个常用的接口:io.Reader 和 io.Writer。 io 包为 I/O 原语提供抽象。 在这些抽象中,io.Reader 从数据源读取数据,io.Writer 将数据写入目标。

2022-10-19 17:27:33 2529

原创 golang中的init初始化函数

init 函数是用于初始化应用程序状态的函数。 它不接受任何参数并且不返回任何结果(一个 func() 函数)。 初始化包时,将初始化包中的所有常量和变量声明。 然后,执行初始化函数。 下面是一个初始化主包的例子:

2022-10-18 18:59:50 1602

原创 golang中的变量阴影

在 Go 中,在块中声明的变量名可以在内部块中重新声明。 这种称为变量阴影的原理很容易出现常见错误。

2022-10-17 23:12:29 261

原创 grpc错误处理

我们调用 gRPC 调用时,客户端会收到带有成功状态的响应或带有相应错误状态的错误。 客户端应用程序需要以能够处理所有潜在错误和错误条件的方式编写。 服务器应用程序要求您处理错误并生成具有相应状态代码的适当错误。

2022-10-17 23:11:31 2545

原创 grpc错误处理

我们调用 gRPC 调用时,客户端会收到带有成功状态的响应或带有相应错误状态的错误。 客户端应用程序需要以能够处理所有潜在错误和错误条件的方式编写。 服务器应用程序要求您处理错误并生成具有相应状态代码的适当错误。

2022-10-17 00:50:29 1896

原创 grpc中的拦截器

当我们编写 HTTP 应用程序时,您可以使用 HTTP 中间件包装特定于路由的应用程序处理程序,可以在执行应用程序处理程序之前和之后执行一些常见的逻辑。 我们通常使用中间件来编写跨领域组件,例如授权、日志记录、缓存等。在 gRPC 中可以使用称为拦截器的概念来实现相同的功能。

2022-10-16 01:18:21 647

原创 golang开发一个简单的grpc

在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您更容易创建分布式应用程序和服务。 与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。 在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。 在客户端,客户端有一个stub(在某些语言中仅称为客户端),它提供与服务器相同的方法。

2022-10-16 01:17:34 629

原创 golang开发一个简单的grpc

在 gRPC 中,客户端应用程序可以直接调用不同机器上的服务器应用程序上的方法,就像它是本地对象一样,使您更容易创建分布式应用程序和服务。 与许多 RPC 系统一样,gRPC 基于定义服务的思想,指定可以远程调用的方法及其参数和返回类型。 在服务端,服务端实现这个接口并运行一个 gRPC 服务器来处理客户端调用。 在客户端,客户端有一个stub(在某些语言中仅称为客户端),它提供与服务器相同的方法。

2022-10-13 23:27:43 500

原创 CORS跨域

跨域资源共享 (CORS) 是一种基于 HTTP 标头的机制,它允许服务器指示除其自身之外的任何来源(域、方案或端口),浏览器应允许从中加载资源。 CORS 还依赖于一种机制,浏览器通过该机制向托管跨域资源的服务器发出“预检”请求,以检查服务器是否允许实际请求。 在该预检中,浏览器发送指示 HTTP 方法的标头和将在实际请求中使用的标头。

2022-10-13 18:34:20 796

原创 golang中的errgroup

假如我们需要查询一个课件列表,其中有课件的信息,还有课件创建者的信息,和课件的缩略图信息。但是此时我们已经对服务做了拆分,假设有课件服务和用户服务还有文件服务。我们通常的做法是,当我们查询课件列表时,我们首先调用课件服务,比如查询10条课件记录,然后获取到课件的创建人ID,课件的缩略图ID;再通过这些创建人ID去用户服务查询用户信息,通过缩略图ID去文件服务查询文件信息;然后再写到这10条课件记录中返回给前端。

2022-10-08 22:42:50 1106

原创 golang垃圾回收

Go 更喜欢在堆栈上分配内存,因此大多数内存分配最终都会在栈上。 这意味着 Go 每个 goroutine 都有一个堆栈,并且在可能的情况下,Go 会将变量分配给这个堆栈。 Go 编译器试图通过执行逃逸分析来查看对象是否被外部变量引用。 如果编译器可以确定一个变量的生命周期,它将被分配到一个堆栈中。 但是,如果变量的生命周期不明确,它将在堆上分配。 通常,如果 Go 程序有一个指向对象的指针,则该对象存储在堆上。 看看这个示例代码:

2022-10-05 12:25:27 902

原创 golang中的socket编程

1. 客户端的协议栈向服务器端发送了 SYN 包,并告诉服务器端当前发送序列号 j,客户端进入 SYNC_SENT 状态;2. 服务器端的协议栈收到这个包之后,和客户端进行 ACK 应答,应答的值为 j+1,表示对 SYN 包 j 的确认,同时服务器也发送一个 SYN 包,告诉客户端当前我的发送序列号为 k,服务器端进入 SYNC_RCVD 状态;3. 客户端协议栈收到 ACK 之后,使得应用程序从 connect 调用返回,表示客户端到服务器端的单向连接建立成功,客户端的状态为 ESTABLISHED

2022-10-01 10:39:52 3437

翻译 golang中经常会犯的一些错误

按值传递变量将创建此变量的副本。而通过指针传递它只会复制内存地址。因此,传递指针总是会更快,对么?

2022-09-25 12:44:14 244

原创 golang中的一些实用功能

通过使用一些通用代码来节省时间,而无需单独实现它们。以下是一些开发中经常会用到的函数实现的列表。

2022-09-25 12:43:08 750

原创 golang中的一些实用功能

通过使用一些通用代码来节省时间,而无需单独实现它们。以下是一些开发中经常会用到的函数实现的列表。

2022-09-23 16:30:06 197

原创 golang中的选项模式

选项模式是一种函数式编程模式,用于为可用于修改其行为的函数提供可选参数。如果你用过php的话,你肯定会看到过这样的函数,毕竟PHP是世界上最好的语言:

2022-09-22 16:42:52 263

原创 rabbitmq原理和应用

RabbitMQ 是一个轻量级且易于部署的消息队列。它支持开箱即用的多种消息传递协议。我们将使用 AMQP(高级消息队列协议)

2022-09-22 12:03:26 227

原创 golang单元测试一(简单函数测试)

单元测试是测试代码、组件和模块的单元函数。单元测试的目的是清除代码中的错误,增加代码的稳定性,在更改代码时提供正确性。单元测试是软件测试的第一级,然后是集成测试和 ui 测试。

2022-09-20 23:43:10 677

原创 golang中的几种并发模式

为了避免内存泄漏,goroutine应该有被触发取消的机制。父 Goroutine 需要通过一个名为 done 的只读通道向其子 Goroutine 发送取消信号。按照惯例,它被设置为第一个参数。

2022-09-19 09:51:55 663

翻译 golang的内存管理

内存管理是管理计算机内存的过程,在主存和磁盘之间移动进程以提高系统的整体性能。内存管理的基本要求是提供方法来根据程序的请求动态的将部分内存分配给程序,并在不需要时释放它以供重用。程序通过将他们的内存划分为执行特定任务的不同部分来管理他们。栈和堆就是这部分中的俩个,他们管理程序的未使用的内存并将其分配给不同类型的数据。当程序不再需要这些内存的时候就会释放他们,供后续使用。

2022-09-17 17:27:35 1427

原创 深入浅出redis缓存应用

只读缓存的流程是这样的:当查询请求过来时,先从redis中查询数据,如果有的话就直接返回。如果没有的话,就从数据库查询,并写入到缓存中。当删改请求过来时,会直接从数据库中删除修改数据,并把redis中保存的数据删除。这样做的好处是,所有最新的数据都在数据库中,而数据库是有数据可靠性保障的。

2022-09-14 23:35:18 314

原创 goroutine&waitgroup下载文件

当我们下载一个大文件的时候,会因为下载时间太久而超时或者出错。那么我么我们可以利用goroutine的特性并发分段的去请求下载资源。

2022-09-13 22:18:27 161

翻译 goroutine调度

一个进程包含可以由任何进程分配的公共资源。这些资源包括但不限于内存地址空间、文件句柄、设备和线程。

2022-09-12 17:37:20 485

原创 go-zero docker-compose 搭建课件服务(九):http统一返回和集成日志服务

一般返回中会有`code`,`message`,`data`。当请求成功的时候`code`返回0或者200,`message`返回success,`data`为要获取的数据;当请求失败的时候`code`返回自定义的错误码,`message`返回展示给前端的错误信息,`data`为空。我们将封装一个错误返回的函数,应用到api handler的返回

2022-09-09 15:15:56 1555 2

原创 go-zero docker-compose 搭建课件服务(八):集成jaeger链路追踪

一个外部请求需要内部若干服务的联动响应,这时候完整的调用轨迹将跨越多个服务,同时包括服务间的网络传输信息与各个服务内部的调用堆栈信息。追踪的主要目的是排查故障,如分析调用链的哪一部分、哪个方法出现错误或阻塞,输入输出是否符合预期,等等。

2022-09-05 14:14:28 1239

原创 etcd实现分布式锁

当并发的访问共享资源的时候,如果没有加锁的话,无法保证共享资源安全性和正确性。这个时候就需要用到锁1、需要具备的特性需要保证互斥访问(分布式环境需要保证不同节点、不同线程的互斥访问)需要有超时机制,防

2022-09-04 11:24:11 1149

原创 go channel原理及使用场景

当存在等待的发送者时,通过 runtime.recv 从阻塞的发送者或者缓冲区中获取数据如果是无缓冲的channel,当有接收者进来时,会直接从阻塞的发送者拷贝数据如果是有缓冲的channel,当有接收者进来时,会先从缓冲区拿数据,接着等待的发送者会把数据拷贝到缓冲区注意这个时候并没有直接去唤醒发送者,而是放到下次p的执行队列中中,下次调度时会唤醒发送者,发送者会做一些释放资源的操作

2022-09-01 18:43:39 405

原创 go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构

go-zero docker-compose 搭建课件服务(六):完善jwt鉴权和返回结构

2022-08-29 10:23:00 344

原创 go-zero docker-compose 搭建课件服务(五):完善user服务

go-zero docker-compose 搭建课件服务(五):完善user服务

2022-08-29 10:22:13 498

原创 go-zero docker-compose搭建课件服务(四):生成Dockerfile

go-zero docker-compose搭建课件服务(四):生成Dockerfile

2022-08-29 10:21:17 800

原创 go-zero docker-compose 搭建课件服务(三):编写courseware api服务

go-zero docker-compose 搭建课件服务(三):编写courseware api服务

2022-08-29 10:20:05 179

原创 go-zero docker-compose 搭建课件服务(七):prometheus+grafana服务监控

1、什么是prometheusPrometheus是一个开源的系统监控和警报工具包。自2012年启动以来,许多公司和组织都采用了Prometheus,该项目拥有非常活跃的开发人员和用户社区。它现在是一

2022-08-28 22:43:21 544

原创 实现etcd服务注册与发现

**服务发现流程**1. 实现grpc中resolver.Builder接口的Build方法2. 通过etcdclient获取并监听grpc服务(是否有新增或者删除)3. 更新到resolver.State,State 包含与 ClientConn 相关的当前 Resolver 状态,包括grpc的地址resolver.Address...

2022-08-25 22:56:05 595

原创 go-zero docker-compose 搭建课件服务(二):编写courseware rpc服务

docker-compose部署go-zero微服务

2022-08-23 13:27:45 375

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除