微服务架构|go-zero 的自适应熔断器

2023-09-02
阅读 10 分钟
1.2k
在一条调用链上,如果发现某个服务异常,比如响应超时。那么调用者为了避免过多请求导致资源消耗过大,最终引发系统雪崩,会直接返回错误,而不是疯狂调用这个服务。

Go 语言中排序的 3 种方法

2023-08-18
阅读 2 分钟
1.1k
原文链接: Go 语言中排序的 3 种方法在写代码过程中,排序是经常会遇到的需求,本文会介绍三种常用的方法。废话不多说,下面正文开始。使用标准库根据场景直接使用标准库中的方法,比如:sort.Intssort.Float64ssort.Strings举个例子: {代码...} 自定义比较器使用 sort.Slice 方法排序时,可以自定义比较函数 less(i, ...

go-zero 是如何实现令牌桶限流的?

2023-08-10
阅读 6 分钟
477
原文链接: go-zero 是如何实现令牌桶限流的?上一篇文章介绍了 如何实现计数器限流?主要有两种实现方式,分别是固定窗口和滑动窗口,并且分析了 go-zero 采用固定窗口方式实现的源码。但是采用固定窗口实现的限流器会有两个问题:会出现请求量超出限制值两倍的情况无法很好处理流量突增问题这篇文章来介绍一下令牌桶算...

go-zero 是如何实现计数器限流的?

2023-08-09
阅读 4 分钟
427
在微服务架构中,一个服务可能需要频繁地与其他服务交互,而过多的请求可能导致性能下降或系统崩溃。为了确保系统的稳定性和高可用性,限流算法应运而生。

go-zero 是如何做路由管理的?

2023-08-09
阅读 5 分钟
480
原文链接: go-zero 是如何做路由管理的?go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分。而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 go-zero 的路由管理是怎么做的,具体采用了哪种技术方案。路由管理方案路由管理方案有很多种,具体应该如何选择,应该根据使用场景,以及实现的...

使用 Go 语言实现二叉搜索树

2023-08-01
阅读 8 分钟
623
原文链接: 使用 Go 语言实现二叉搜索树二叉树是一种常见并且非常重要的数据结构,在很多项目中都能看到二叉树的身影。它有很多变种,比如红黑树,常被用作 std::map 和 std::set 的底层实现;B 树和 B+ 树,广泛应用于数据库系统中。本文要介绍的二叉搜索树用的也很多,比如在开源项目 go-zero 中,就被用来做路由管理...

Go 语言 select 都能做什么?

2023-07-28
阅读 2 分钟
455
原文链接: Go 语言 select 都能做什么?在 Go 语言中,select 是一个关键字,用于监听和 channel 有关的 IO 操作。通过 select 语句,我们可以同时监听多个 channel,并在其中任意一个 channel 就绪时进行相应的处理。本文将总结一下 select 语句的常见用法,以及在使用过程中的注意事项。基本语法select 语句的基本语...

Go 语言 context 都能做什么?

2023-07-02
阅读 6 分钟
880
原文链接: Go 语言 context 都能做什么?很多 Go 项目的源码,在读的过程中会发现一个很常见的参数 ctx,而且基本都是作为函数的第一个参数。为什么要这么写呢?这个参数到底有什么用呢?带着这样的疑问,我研究了这个参数背后的故事。开局一张图:核心是 Context 接口: {代码...} 包含四个方法:Done():返回一个 cha...

为什么说 Go 语言字符串是不可变的?

2023-06-02
阅读 1 分钟
566
原文链接: 为什么说 Go 语言字符串是不可变的?最近有读者留言说,平时在写代码的过程中,是会对字符串进行修改的,但网上都说 Go 语言字符串是不可变的,这是为什么呢?这个问题本身并不困难,但对于新手来说确实容易产生困惑,今天就来回答一下。首先来看看它的底层结构: {代码...} 和切片的结构很像,只不过少了一...

Go 语言 map 如何顺序读取?

2023-05-27
阅读 2 分钟
667
原文链接: Go 语言 map 如何顺序读取?Go 语言中的 map 是一种非常强大的数据结构,它允许我们快速地存储和检索键值对。然而,当我们遍历 map 时,会有一个有趣的现象,那就是输出的键值对顺序是不确定的。现象先看一段代码示例: {代码...} 当我们多执行几次这段代码时,就会发现,输出的顺序是不同的。原因首先,Go ...

Go 语言 map 是并发安全的吗?

2023-05-27
阅读 5 分钟
795
Go 语言中的 map 是一个非常常用的数据结构,它允许我们快速地存储和检索键值对。然而,在并发场景下使用 map 时,还是有一些问题需要注意的。

为什么 Go for-range 的 value 值地址每次都一样?

2023-04-30
阅读 2 分钟
1.4k
循环语句是一种常用的控制结构,在 Go 语言中,除了 for 关键字以外,还有一个 range 关键字,可以使用 for-range 循环迭代数组、切片、字符串、map 和 channel 这些数据类型。

Go 语言切片是如何扩容的?

2023-04-09
阅读 7 分钟
1.2k
原文链接: Go 语言切片是如何扩容的?在 Go 语言中,有一个很常用的数据结构,那就是切片(Slice)。切片是一个拥有相同类型元素的可变长度的序列,它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一种引用类型,它有三个属性:指针,长度和容量。底层源码定义如下: {代码...} 指针: 指向 slice 可...

Go 语言数组和切片的区别

2023-04-02
阅读 3 分钟
1.2k
原文链接: Go 语言数组和切片的区别在 Go 语言中,数组和切片看起来很像,但其实它们又有很多的不同之处,这篇文章就来说说它们到底有哪些不同。另外,这个问题在面试中也经常会被问到,属于入门级题目,看过文章之后,相信你会有一个很好的答案。数组数组是同一种数据类型元素的集合,数组在定义时需要指定长度和元素...

Go 语言 new 和 make 关键字的区别

2023-03-26
阅读 3 分钟
1.3k
本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的。那就是 new 和 make 这两个内置函数的区别。

为什么 Go 语言 struct 要使用 tags

2023-03-11
阅读 5 分钟
1.1k
在 Go 语言中,struct 是一种常见的数据类型,它可以用来表示复杂的数据结构。在 struct 中,我们可以定义多个字段,每个字段可以有不同的类型和名称。

为什么 Go 不支持 []T 转换为 []interface

2023-01-30
阅读 6 分钟
1k
在 Go 中,如果 interface{} 作为函数参数的话,是可以传任意参数的,然后通过类型断言来转换。举个例子: {代码...} 不管是传 int 还是 string,最终都能输出正确结果。那么,既然是这样的话,我就有一个疑问了,拿出我举一反三的能力。是否可以将 []T 转换为 []interface 呢?比如下面这段代码: {代码...} 很遗憾,这...

推荐 10 本 Go 经典书籍,从入门到进阶(含下载方式)

2022-03-03
阅读 3 分钟
8k
书单一共包含 10 本书,分为入门 5 本,进阶 5 本。我读过其中 7 本,另外 3 本虽然没读过,但也是网上推荐比较多的。虽然分了入门和进阶,但是很多书中这两部分内容是都包含了的。大家看的时候可以根据自己的情况,先打好基础,再进行进阶。有的书是开源的,可以直接在线阅读,有的有电子书,大家可以在这里 GitHub 找...

读 Go 源码,可以试试这个工具

2022-02-08
阅读 2 分钟
2.7k
原文链接: 读 Go 源码,可以试试这个工具编程发展至今,从面向过程到面向对象,再到现在的面向框架。写代码变成了一件越来越容易的事情。学习基础语法,看看框架文档,几天时间搞出一个小项目并不是一件很难的事情。但时间长了就会发现,一直这样飘在表面是不行的,技术永远得不到提升。想要技术水平有一个质的飞跃,有...

Go Error 嵌套到底是怎么实现的?

2022-01-14
阅读 4 分钟
1.3k
原文链接: Go Error 嵌套到底是怎么实现的?Go Error 的设计哲学是 「Errors Are Values」。这句话应该怎么理解呢?翻译起来挺难的。不过从源码的角度来看,好像更容易理解其背后的含义。Go Error 源码很简单,寥寥几行: {代码...} error 是一个接口类型,只需要实现 Error() 方法即可。在 Error() 方法中,就可以返回...

为什么要避免在 Go 中使用 ioutil.ReadAll?

2022-01-06
阅读 6 分钟
9k
原文链接: 为什么要避免在 Go 中使用 ioutil.ReadAll?ioutil.ReadAll 主要的作用是从一个 io.Reader 中读取所有数据,直到结尾。在 GitHub 上搜索 ioutil.ReadAll,类型选择 Code,语言选择 Go,一共得到了 637307 条结果。这说明 ioutil.ReadAll 还是挺受欢迎的,主要也是用起来确实方便。但是当遇到大文件时,这个函...

如何在 Go 中将 []byte 转换为 io.Reader?

2021-12-29
阅读 4 分钟
7.7k
在 stackoverflow 上看到一个问题,题主进行了一个网络请求,接口返回的是 []byte。如果想要将其转换成 io.Reader,需要怎么做呢?

Go 的 golang.org/x/ 系列包和标准库包有什么区别?

2021-12-23
阅读 1 分钟
2k
在开发过程中可能会遇到这样的情况,有一些包是引入自不同地方的,比如:golang.org/x/net/html 和 net/html,golang.org/x/crypto 和 crypto。那这是什么原因呢?引用 Go 官方 Wiki 的说法:The golang.org/x/... repositories are part of the Go Project but outside the main Go tree.They are developed under loos...

开始读 Go 源码了

2021-12-03
阅读 3 分钟
2.2k
在写项目的过程中,发现一个问题。实现功能是没问题的,但不知道自己写的代码是不是符合 Go 的风格,是不是够优雅。所以我觉得相比于继续学习应用开发,不如向底层前进,打好基础,打好写 Go 代码的基础。

开源项目|Go 开发的一款分布式唯一 ID 生成系统

2021-11-09
阅读 2 分钟
1.8k
原文连接: 开源项目|Go 开发的一款分布式唯一 ID 生成系统今天跟大家介绍一个开源项目:id-maker,主要功能是用来在分布式环境下生成唯一 ID。上周停更了一周,也是用来开发和测试这个项目的相关代码。美团有一个开源项目叫 Leaf,使用 Java 开发。本项目就是在此思路的基础上,使用 Go 开发实现的。项目整体代码量并...

测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她

2021-10-25
阅读 12 分钟
1.8k
原文链接: 测试小姐姐问我 gRPC 怎么用,我直接把这篇文章甩给了她上篇文章 gRPC,爆赞 直接爆了,内容主要包括:简单的 gRPC 服务,流处理模式,验证器,Token 认证和证书认证。在多个平台的阅读量都创了新高,在 oschina 更是获得了首页推荐,阅读量到了 1w+,这已经是我单篇阅读的高峰了。看来只要用心写还是有收获...

听说,99% 的 Go 程序员都被 defer 坑过

2021-10-18
阅读 6 分钟
1.1k
原文链接: 听说,99% 的 Go 程序员都被 defer 坑过先声明:我被坑过。之前写 Go 专栏时,写过一篇文章:Go 专栏|错误处理:defer,panic 和 recover。有小伙伴留言说:道理都懂,但还是不知道怎么用,而且还总出现莫名奇妙的问题。出问题就对了,这个小东西坏的很,一不留神就出错。所以,面对这种情况,我们今天就不...

gRPC,爆赞

2021-10-12
阅读 13 分钟
1.9k
原文链接: gRPC,爆赞gRPC 这项技术真是太棒了,接口约束严格,性能还高,在 k8s 和很多微服务框架中都有应用。作为一名程序员,学就对了。之前用 Python 写过一些 gRPC 服务,现在准备用 Go 来感受一下原汁原味的 gRPC 程序开发。本文的特点是直接用代码说话,通过开箱即用的完整代码,来介绍 gRPC 的各种使用方法。代...

使用 grpcurl 通过命令行访问 gRPC 服务

2021-09-30
阅读 4 分钟
5.7k
原文链接: 使用 grpcurl 通过命令行访问 gRPC 服务一般情况下测试 gRPC 服务,都是通过客户端来直接请求服务端。如果客户端还没准备好的话,也可以使用 BloomRPC 这样的 GUI 客户端。如果环境不支持安装这种 GUI 客户端的话,那么有没有一种工具,类似于 curl 这样的,直接通过终端,在命令行发起请求呢?答案肯定是有...

Go 专栏|并发编程:goroutine,channel 和 sync

2021-09-16
阅读 5 分钟
1.1k
在当今这个多核时代,并发编程的意义不言而喻。使用 Go 开发并发程序,操作起来非常简单,语言级别提供关键字 go 用于启动协程,并且在同一台机器上可以启动成千上万个协程。
封面图