- 博客(138)
- 资源 (1)
- 收藏
- 关注
原创 在go中监听多个channel
我们可以使用select关键字来同时监听多个goroutine。你可以看到select语句和switch语句在设计上非常相似。两者都定义了不同的情况,并在满足某种情况时运行相应的代码。另外,我们可以看到select语句是阻塞的。也就是说,它将等待,直到其中一个 case 被满足。我们为这个循环迭代了两次,因为只有两个goroutine需要监听。更确切地说,每个goroutine都是一个fire-and-forget goroutine,意味着它们在返回之前只向一个通道发送一次。
2024-08-24 09:46:11
904
原创 Golang 中的 Recover 处理错误
Golang 中的 recover 是一个鲜为人知但非常有趣和强大的功能。让我们看看它是如何工作的,以及在 Outreach.io 中如何利用它来处理 Kubernetes 中的错误。Panic/Defer/Recover 基本上是 Golang 中对于其他编程语言中 throw/finally/catch 概念的替代品。它们有一些共同之处,但在一些重要细节上有所不同。
2024-08-23 12:41:44
557
原创 Go语言中的闭包:封装数据与功能的强大工具
go官方有一句解释:翻译过来就是:函数字面量(匿名函数)是闭包:它们可以引用在周围函数中定义的变量。然后,这些变量在周围的函数和函数字面量之间共享,只要它们还可以访问,它们就会继续存在。闭包是一种创建函数的方法,这些函数可以访问在其主体之外定义的变量。闭包是一个可以捕捉其周围环境状态的函数。这意味着函数可以访问不在其参数列表中或在其主体中定义的变量。闭包函数可以在外部函数返回后访问这些变量。
2024-08-21 12:56:55
856
原创 Go 内存分配:结构体中的优化技巧
现在,当结构体的最后一个字段与架构的对齐要求不完全一致时,会在最后一个字段之后添加填充,以确保结构体的整体大小是其字段中最大对齐要求的倍数。现在,Golang确保m是满足变量x的内存地址 % m == 0的最大可能数,也就是说,变量x的内存地址是m的倍数。我们可以看到,通过重新排列字段的位置,使得对齐需要最小化填充,我们已经将结构体的大小从32减小到24,这是内存优化的巨大进步,达到了25%。字段b中的字符串看起来比16个字节要长得多,如果字符串的偏移量是8,那么字段c的偏移量应该更大一些。
2024-08-21 12:55:55
516
原创 go中使用反射的动态方法调用
在这个例子中,我们创建了一个MyType的实例,使用reflect.ValueOf获得一个代表该实例的reflect.Value,使用value.MethodByName获得一个代表Foo方法的reflect.Method,并使用method.Call在该实例上调用该方法。我们可以使用reflect.Value类型来表示任何类型的值,并且我们可以调用reflect.Value上的方法来检查和修改该值。注意,使用反射调用方法的效率低于直接调用方法的效率,因为它涉及到大量的间接性和类型检查。
2024-08-20 11:30:55
456
原创 go 利用范型构建 Set
在Union中,我们只是在一个集合上进行迭代,将值添加到另一个集合中。在Intersection中,我们要检查a中的值是否也在b中,并返回一个只包含两者元素的集合。首先,我们要定义什么是集合,通过泛型,我们可以利用约束条件来轻松地扩展集合类型,以处理许多数据类型。我们简单地创建一个容量为0的新集合(因为我们不知道这个新集合会有多大),然后在集合a上进行迭代,只添加不包含在b中的元素。在第一节中,我们创建了我们的Set类型,它利用了内置的map类型。然而,在Union中,我们覆盖了大集合,它可能是a或b。
2024-08-20 11:30:02
360
原创 go 享元模式
是一种结构型设计模式, 它摒弃了在每个对象中保存所有数据的方式, 通过共享多个对象所共有的相同状态, 让你能在有限的内存容量中载入更多对象。
2024-08-19 13:30:55
374
原创 go 模版方法模式
在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模版方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
2024-08-14 12:36:28
163
原创 go 责任链模式
责任链模式是一种行为设计模式,允许你将请求沿着处理者链进行发送。收到请求后,每个处理者均可对请求进行处理,或将其传递给链上的下个处理者。
2024-08-12 13:11:36
427
原创 go 命令模式
将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。模型说明触发者类负责对请求进行初始化,其中必须包含一个成员变量来存储对于命令对象的引用。触发命令,而不同接受者直接发送请求。注意,发送者并不负责创建命令对象:它通常会通过构造函数从客户端处获得预先生成的命令。命令接口通常仅声明一个执行命令的方法。具体命令会实现各种类型的请求。具体命令自身并不完成工作,而是会将调用委派给一个业务逻辑对象。但为了简化代码,这些类可以进行合并。
2024-08-11 13:58:13
294
原创 go 单例模式
确保类只有一个实例,并提供一个全局的访问点。单例(Singleton)类声明了一个名为getInstance的方法来返回其所属类的一个相同实例。单例的构造函数必须对客户端的代码隐藏。调用getInstance方法必须是获取单例对象的唯一方式。
2024-08-10 10:51:28
361
原创 go 的内存布局和分配原理
根据内存管理(分配和回收)方式的不同,可以将内存分为 堆内存 和 栈内存。那么他们有什么区别呢?堆内存:由内存分配器和垃圾收集器负责回收栈内存:由编译器自动进行分配和释放一个程序运行过程中,也许会有多个栈内存,但肯定只会有一个堆内存。每个栈内存都是由线程或者协程独立占有,因此从栈中分配内存不需要加锁,并且栈内存在函数结束后会自动回收,性能相对堆内存要好。而堆内存呢?
2024-08-09 17:19:19
710
原创 go 切片长度与容量的区别
切片是一个结构体,保存着切片的容量,长度以及指向数组的指针(数组的地址)。从源码来看,当一个切片进行扩容时,会进行 growslice,这是一个花销较大的操作,在日常开发中,如果能明确知道切片的长度或者容量时,我们需要在初始化的时候声明,避免切片频繁扩容而带来的花销。
2024-08-07 12:34:45
292
原创 gRPC-Go基础(5)middleware
if err!= nil {类似于grpc_zap.UnaryServerInterceptor,我们在建立服务的时候设置拦截器。)),)),在handler之前的部分,先注册的拦截器先执行;在handler之后的部分,先注册的拦截器后执行;原因是,在ChainUnaryServer函数中,是倒序将注册的拦截器函数一个个包装,最里面的就是核心的处理逻辑,故而会展现出以上的规则。
2024-08-07 12:34:10
314
原创 gRPC-Go基础(2)protobuf
protobuf实际上是一套类似于Json或者XML的数据传输格式和规范,用于不同应用、平台之间的通信,而message就是作为protobuf中定义通信的数据格式。其中,Reset()、String()和ProtoMessage()都是MessageV1定义的接口,在我们的版本中并用不到,为了兼容,生成器还是生成了这部分接口实现。
2024-07-29 20:16:01
413
原创 gRPC-Go基础(1)基础知识
gRPC是Google发起的、开源的、高性能远程过程调用(RPC)框架系统,该系统基于HTTP/2协议传输,使用Protocol Buffer作为接口描述语言。在gRPC中,客户端程序可以像调用函数一样地调用不同机器上的应用程序,其客户端和服务端可以在各种gRPC支持的语言的环境之间互相通信Protocol Buffers是谷歌发起的开源的, 语言无关、平台无关、可扩展的序列化结构化数据的协议。
2024-07-29 20:15:07
247
原创 Go语言中的定时器和打点器
本文深入介绍了在 Go 语言中使用 time.Timer 和周期性定时器(time.Ticker)来实现定时任务和事件触发的方法。定时器是在许多应用场景中都非常有用的工具,它们可以帮助我们在指定的时间点执行特定的操作,或者在一定时间间隔内定期执行任务。
2024-07-28 16:13:14
419
原创 go 定时器
然后,我们启动一个 goroutine,从 ticker.C channel 接收值,每当滴答声响起时,goroutine 就会发出一个值。在更新后的代码中,我们创建了一个 goroutine 来处理定时器过期,这样就可以在定时器过期前停止它。否则,我们将打印 “定时器已停止”。使用 time.Sleep() 等待 2 秒后,我们调用 timer.Reset(),新的持续时间为 3 秒。要在 Go 中创建一个定时器,我们可以使用 time.NewTimer() 函数,该函数将持续时间作为参数。
2024-07-28 16:12:27
256
原创 Go HTTP 调用(下)
对于 HTTP 中的 query 参数和 body 参数的如何传递,上下两篇文章已经通过例子进行介绍。发起 HTTP POST 请求时,携带 json 格式的 body 参数是最常见的,这是因为 json 格式的参数可读性好,对于层级结构较为复杂的数据也能应对,并且这符合 RestFul API 的规范。上篇文章 Go HTTP 调用(上) 介绍了如何进行 HTTP 调用,并通过 GET 请求的例子,讲述了 query 参数和 header 参数如何设置,以及响应体的获取方法。
2024-07-27 12:12:46
274
原创 Go HTTP 调用(上)
通过 url.Values 结构体的 set 方法设置 query参数,url 通过 url.Parse 函数生成一个 URL 结构体指针变量,rawUrl.RawQuery = params.Encode() 通过这行代码将 query 参数和 url 进行绑定,最后通过 String() 方法将 url 转换成 string 类型。对于一个请求里的 URL,查询参数,请求 method 等参数,需要 http 包里的 Request 结构体去封装。参数 body,为请求体参数。
2024-07-27 12:12:00
398
原创 Go map转json
尝试使用过Any,发现不行(Any的“风评”很不好,介绍时一般和one of出现在一起)当有的场景,要返回哪些字段不确定时,就无法使用struct的方式。如果使用proto来定义接口,如何定义不确定字段名称和数量的返回值?几经探求,发现这种情况该用Struct(或说Value)类型。即上面的 jsonStr,如何定义才能返回给前端?
2024-07-26 12:41:01
439
原创 「Go框架」gin框架是如何处理panic的?
在gin中,是通过使用该中间件来捕获panic,并保证服务不down机的。在defer函数中,如果捕获了panic,则将panic的详细详细记录下来,可以发送到指定的输出中,即函数中指定的out参数(默认是os.Stderr),也可以指定其他的文件或Sentry等。在gin中,正是该中间件的应用,确保了web服务的健壮性。当然,其他的web框架也有同样的机制,实现原理也是一样的。即指错误的输出到什么地方。作为中间件运行,说明每次请求的处理器都被中间件包装了,也就相当于每个请求处理器都有这个defer函数。
2024-07-26 12:39:22
384
原创 Go的数据结构与实现【Ring Buffer】
data []Tread intwrite int我们定义一个环形缓冲区结构体,其中包含值数组、数组大小,读指针和写指针。同时,它也是并发安全的。
2024-07-24 12:54:48
700
Java 课程设计,万年历(Java Swing),适用大一/大二
2024-08-29
基于openCV的人脸识别
2024-08-26
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-24
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-24
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-20
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-20
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-20
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-17
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-17
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-13
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-11
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-07
基于springboot+vue+MySQL实现的在线考试系统+源代码+文档
2024-06-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人