![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go语言
文章平均质量分 93
shark-chili
这个作者很懒,什么都没留下…
展开
-
go语言系列专栏汇总
无论您是初学者还是有一定经验的开发者,这个专栏都将为您提供宝贵的学习资源和实践指导,助您在Go语言的世界中探索出更高效的编程之道。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。的核心概念、优雅的语法特性以及实用的编程技术,从而提升自己在Go语言开发领域的能力。,是个不断在硬核技术上作死的。原创 2024-01-01 22:42:30 · 972 阅读 · 0 评论 -
用go语言实现一个有界协程池
基于上图我们给出worker的接口定义,按照我们的实现每一个任务都是一个worker,协程池的协程可以从channel中得到对应的Worker并执行其TaskTask()原创 2024-05-27 08:30:00 · 678 阅读 · 0 评论 -
聊聊go语言对于socket的抽象
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。的对应协程挂起,反之若收到新连接则基于内核函数封装成一个。的实现,其本质就是调用accept方法获取就绪的。即可和笔者和笔者的朋友们进行深入交流。原创 2024-05-23 08:59:57 · 820 阅读 · 0 评论 -
聊聊Go语言中的networkpoller工作机制
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。自此我们完整的将Go语言中的networkpoller的设计和源码都分析完成了,希望对你有帮助。方法,就可以看到我们上图所说明的状态修改和协程入队的操作,它通过。当我们和客户端建立连接之后,我们的客户端协程就会调用连接对象的。原创 2024-05-22 10:55:18 · 954 阅读 · 0 评论 -
聊聊go语言基于epoll的网络并发实现
处理,而边缘触发为避免这种频繁在用户态到内核态的开销,如果当前IO数据没处理完,则等待下一次IO数据就绪后再处理,所以这种模式就要求应用程序必须一次性将数据读取完成,在应用层面进行处理。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。获取就绪的事件,基于这些事件定位到对应的。原创 2024-05-20 08:30:00 · 991 阅读 · 0 评论 -
协程是否越多越好
协程设计的初衷就是线程用后即焚,所以从业角度考虑,假设我们开大量协程执行耗时任务,这就会导致单位时间内有大量的协程都活跃与内存中,无法做到即用即毁,随着时间的推移就看你会把内存资源耗尽。从一个Java程序员的角度出发,大部分都认为协程应该可以向线程一样通过池化进行复用,但是我们不推荐这种做法,因为go语言本身就内置对协程池化的管理机制,并且协程的使用初衷就是即用即毁,避免池化,所以这个方案我们不推荐。以上便是笔者对于协程创建的量的问题的思考和总结,希望对你有帮助。即可和笔者和笔者的朋友们进行深入交流。原创 2024-05-16 08:29:11 · 490 阅读 · 0 评论 -
聊聊go语言对于协程并发的设计
为了保证全局队列中新建的协程能够被及时执行,它设定了从全局队列获取协程的时机,从而保证执行一段时间后会主动到全局队列获取最新协程,这一点笔者会在后文的源码分析中再次提及,这里读者先了解的这个设计思路即可。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。我们先来说说上文所说的主动挂起,对应的源码在。原创 2024-05-09 08:30:00 · 1011 阅读 · 0 评论 -
用Go实现一个无界资源池
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。听起来很像是Java的无界线程池,接下来我们就基于这个需求实现一个版本。以上便是笔者对于无界资源池的实现思路,希望对你有帮助。即可和笔者和笔者的朋友们进行深入交流。即可和笔者和笔者的朋友们进行深入交流。,是个不断在硬核技术上作死的。原创 2024-05-06 08:30:00 · 735 阅读 · 0 评论 -
用Go语言实现一个单协程消费者模型
本文会给基于我们之前所学的知识进行一个综合的实践,通过单个协程实现一个生产者生产者模式,希望能够让你对go语言的开发有着更深刻的理解和掌握。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。提供给外部启动的我们的消费者,该方法会直接监听操作系统的中断信号,并启动协程开始执行。原创 2024-04-28 08:30:00 · 923 阅读 · 0 评论 -
基于Go语言的网络IO扫盲
自此我们完成了对于网络IO模型的扫盲,接下来我们就基于go语言的API实现一个简单的高性能网络交互程序,代码如下,可以看到只需我们进行连接监听和读写操作都是采用go语言封装好的上层函数,对于epoll等IO模型go语言会在编译时根据操作系统信息自行决定,而我们只需基于这些函数获取连接,并将连接交给协程处理即可实现一个高性能的。很明显这种一连接一线程的设计如果遇到建立连接后很少进行数据收发的连接的情况,不仅会导致宝贵的线程资源浪费,在高并发的场景还会导致。对网络交互进行的高度的抽象,这使得我们进行。原创 2024-04-26 09:32:18 · 989 阅读 · 0 评论 -
聊聊go语言中的GMP模型
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。对每一个线程的利用都做到的极致的压榨,一旦线程对应协程队列为空时,且全局的协程队列也为空的时候,当前处理器p就会采取。的工作流程后,我们就可以通过源码的方式印证这个问题,首先来看看处理器模型的源码,通过。这里我们不妨看看从全局队列获取协程的源码。原创 2024-04-24 08:30:00 · 629 阅读 · 0 评论 -
go语言如何实现协程的抢占式调度的?
实现协程并发,为了避免单协程持续持有线程导致线程队列中的其他协程饥饿问题,设计者提出了一个抢占式调度机制,本文会基于一个简单的代码示例对抢占式调度过程进行深入讲解剖析。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。假设我们的协程没有进行额外的函数调用,是否就意味着当前协程的线程不能被抢占呢?原创 2024-04-23 08:30:00 · 947 阅读 · 0 评论 -
go语言是如何实现协程的
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。的精华就在于协程的设计,只有理解协程的设计思想和工作机制,才能确保我们能够完全的利用协程编写强大的并发程序。自此我们从go语言底层实现的角度完整的剖析的协程与线程的关系和实现,希望对你有帮助。记录整个foo1函数的高低地址,假设我们当前的协程。原创 2024-04-19 08:30:00 · 817 阅读 · 0 评论 -
聊聊go语言中的内存填充
在进行不同的内存填充的时候,不同类型变量都着不同的对齐系数,例如布尔和int32对应的内存系统为1和4,以下图为例,布尔的对齐系统为1就意味着它的内存空间首地址能被1整除,所以我们分配为。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。字节,原因很简单,bool为1字节,填充首位。原创 2024-04-18 09:08:24 · 681 阅读 · 0 评论 -
深入理解go语言中的切片
本文通过切片的创建结合汇编码了解的切片底层数据结构和创建过程,再通过代码示例结合源码的方式了解了切片的动态扩容机制,了解切片在扩容时如何在空间和时间上实现折中,希望对你有帮助。都说切片会动态扩容,这里我们创建一个容量为10的切片,在容量以内添加元素,其容量和size都没有变化,一旦追加元素就会触发扩容,可以看到此时已用。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。若新的长度大于容量的2倍则判断旧的容量是否超。原创 2024-04-16 08:34:52 · 613 阅读 · 0 评论 -
聊聊Go语言中的字符串
字符类型是开发中最常用到的类型,不同的语言有着不同的实现,这篇文章我们来聊聊go语言的字符串类型,本文会从go语言底层实现的角度分析字符串的设计与实现,相信读者通过对本文的阅读会对go语言中字符的实现有着不错的理解和掌握。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。原创 2024-04-12 08:44:03 · 992 阅读 · 0 评论 -
go语言是如何解决map并发安全问题的?
常说go语言是一门并发友好的语言,对于并发操作总会在编译期完成安全检查,所以这篇文章我们就来聊聊go语言是如何解决map这个数据结构的线程安全问题。Hi,我是 sharkChili ,是个不断在硬核技术上作死的 java coder ,是 CSDN的博客专家 ,也是开源项目 Java Guide 的维护者之一,熟悉 Java 也会一点 Go ,偶尔也会在 C源码 边缘徘徊。写过很多有意思的技术博客,也还在研究并输出技术的路上,希望我的文章对你有帮助,非常欢迎你关注我的公众号: 写代码的SharkChili原创 2024-04-11 08:41:28 · 896 阅读 · 0 评论 -
Go语言企业级日志管理
这里也补充一下为什么可以用异或运算符拼接配置的原因,因为这些日志参数的常量都会对应一个不同的二进制数,通过不同的二进制数对应到不同的配置项从而生成日志配置。即使系统没有任何表现,程序也可能会有一些潜藏的隐患,所以通过日志来监控程序的运行就显得尤为重要,对此笔者便基于此文来聊聊go语言中的日志的配置和使用。的三个配置决定日志的输出目的地,前缀、格式,如下所示,对应的日志就是不输出,且前缀为Trance,格式为。如果我们希望打印的错误显示异常的堆栈信息,我们可以通过。即可和笔者和笔者的朋友们进行深入交流。原创 2024-04-10 08:30:00 · 1047 阅读 · 0 评论 -
聊一聊go语言的空值
这样的数据结构,我们只能自行实现,了解Java的Hashset的读者都知道,Hashset本质就是对hashMap的封装,用map的key作为set的value,将value全部设置为null。那么问题来了,既然空结构体的大小为0,如果考虑到空结构体0大小的特点,我们是否可以认为如果这些空结构体存在地址时,它们的地址都是一样的呢?因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。关于这个地址值,我们可以在内存分配的工具包。原创 2024-04-07 08:30:00 · 639 阅读 · 0 评论 -
聊聊go语言中的maven
我们通过goland创建的项目,默认情况下goland为默认为我们生成一个go.mod文件,其内容标明了我们项目的名称以及go工具包。原创 2024-04-03 08:30:00 · 946 阅读 · 0 评论 -
一文速通Go语言面向对象编程
notify()原创 2024-04-01 08:30:00 · 1543 阅读 · 0 评论 -
一文速通go语言类型系统
id intage int如果希望声明这个变量的初始值,可直接用varvar u useru := user{id: 1,age: 18,//按照字段顺序略去字段名的声明如果我们声明了一个自定义的类型Duration,如下所示,可以看到它其实就是int64,初学go语言的读者可能会认为它和int64如果是用这种语法,编译是无法通过的var dur Duration //正确的做法 dur = 5 fmt . Println(dur)原创 2024-03-29 08:30:00 · 1674 阅读 · 0 评论 -
一文速通Go语言的map
因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。的映射,映射即根据指定算法将键值对落地指定的位置的数据结构,这使得我们再进行定位时就像查阅字典一样可以快速检索和操作。还有一种则是通过字面量的方式完成声明,注意如果按照下述语法进行声明的话,映射的长度就会根据初始化制定的键值对长度而定。原创 2024-03-28 08:30:00 · 887 阅读 · 0 评论 -
一文快速掌握Go语言切片
同样的假如我们希望通过字面量的方式完成创建,例如我们希望通过字面量的方式创建一个长度为7的切片,那么我们就可以给索引6的元素设置一个值,让编译器自动根据我们字面量声明的上限设置一个。因为切片是对数组的封装,在函数传递时复制的是切片的引用,这使得切片作为参数时,操作的元素就是入参的值,这也就意味着切片在函数间的传递是没有大量元素拷贝的开销的。我们也可以从一个切片上截取一部分元素生成一个新的切片,假设我们的源切片有元素1-5,我们希望从截取长度为2,容量为4的切片。这里我们给出切片的创建语法为为。原创 2024-03-27 08:30:00 · 1612 阅读 · 0 评论 -
聊聊go语言中map如何解决散列性能下降
很明显,如果极端情况下因为有限的桶导致大量的冲突就很可能使map元素定位的时间复杂度退化为O(n),所以我们需要重新计算哈希值以及对桶进行扩容,从而解决极端的哈希冲突场景。的键值对的值,在进行修改的过程中,map就会通过哈希定位到旧的bucket的key-111的值,然后进行修改,完成后基于全新的哈希算法。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。上的桶的数据也就都驱逐完成了,随后跳出这些代码段,再次回到。原创 2024-03-25 08:30:00 · 687 阅读 · 0 评论 -
来聊聊go语言的hashMap
这个文件中定位到这个方法,该方法会先判断需要分配的内存是否超出最大值,如果未超过则会进行哈希种子初始化、桶的大小计算,以及考虑到后续的空间会根据B的值判断,根据设计者们的经验来看,它们认为当B大于4即桶的个数大于8的情况下的场景有很大概率出现溢出的情况,所以它们会在。设计有着不同的设计思想,而这篇文章我将从go语言的角度来聊聊哈希集的设计,希望通过这篇文章的阅读可以让读者对于map的设计有着更进一步的理解。的索引为2,但是索引2的bmap空间全被占用,那么go语言就会基于拉链法的思想,创建一个全新的。原创 2024-03-22 08:30:00 · 790 阅读 · 0 评论 -
一文带你速通go语言指针
指针即指向变量的地址,在计算机宝贵的内存中存在成千上万的变量,对于某些可复用的变量,我们可以通过指针进行操作,避免拷贝的开销,从而提升系统的执行效率。原创 2024-03-21 08:30:00 · 16568 阅读 · 0 评论 -
聊聊Go程序是如何运行的
我们先来看看运行时检查的步骤,这段代码在runtime1.go上,从笔者贴出的代码不难看出,这个方法会在程序运行进行类型长度、CAS、指针、原子类的进行正确性的检查操作。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。是跨平台的语言,所以底层对各大平台的启动都做了特定的封装,以笔者的。原创 2024-03-19 08:30:00 · 1830 阅读 · 0 评论 -
速通Go语言编译过程
通过上述的步骤之后,系统就会得到中间码,自此各个平台都会基于这段中间码生成汇编码,当然如果你对汇编码感兴趣,可以通过下面这段执行看到我们的代码转为。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。因为近期收到很多读者的私信,所以也专门创建了一个交流群,感兴趣的读者可以通过上方的公众号获取笔者的联系方式完成好友添加,点击备注。,而笔者这里所说的最小语义,读者完全可以理解为上述的每一个关键字,例如。原创 2024-03-13 08:30:00 · 719 阅读 · 0 评论 -
一文带你速通Go语言数组
但是需要注意的是指针复制的都是每个元素的指针,也就意味着我们修改任意一个数组元素指针所指向的地址空间,都会影响到另一个数组指针指向的值。是必传的,否者声明的就是切片,关于切片的知识点笔者会在后续的文章中推出,建议感兴趣的读者留意文章的联系方式实时关注笔者推送的系列专栏。对于数组的声明,其语法格式如下所示,可以看到变量名在前,类型在后,与Java数组声明不同的是,Go语言的数组声明格式为。对应的输出结果如下,可以看到go语言的遍历都是由默认值的,以int为例,每个数组空间的值都是默认为0。原创 2024-03-12 08:30:00 · 1032 阅读 · 0 评论 -
一文带你速通Go语言基础语法
Hi,我是sharkChili,是个不断在硬核技术上作死的java coder,是CSDN的博客专家,也是开源项目Java Guide的维护者之一,熟悉Java也会一点Go,偶尔也会在C源码边缘徘徊。与其他的编程语言(Java)有所不同,Go语言对不同的精度数字类型计算时不会进行自动的类型升级,所以在进行整数和小数的运算时,我们需要进行一下强转,强转的语法如下即。这篇文章算是一篇基本的语法速通的扫盲,通过这篇文章你将会对Go的语法和一些编程习惯有一个初步的了解和掌握。原创 2024-03-08 08:30:00 · 2527 阅读 · 0 评论 -
关于我想写一个Go系列的这件事
因为笔者是日常开发只用到Windows和Linux下载集成开发环境安装包。安装。配置环境变量。原创 2024-03-07 08:30:00 · 1029 阅读 · 0 评论 -
写给Java开发的Go语言协程速通实践
在go语言中,协程这个概念对应着就是goroutine,每个goroutine都有自己的堆栈和寄存器,可以在不同的系统线程中执行,go语言会为每一个线程分配一个逻辑处理器调取这些goroutine,然后基于这个逻辑处理器,我们可以创建成千上万个goroutine,通过用户态级别的协程切换高效实现并发编程。go语言提供的通道有两种,我们先来说说无缓冲通道,该通道的特点和名字一样,通道间不提供缓存数据的缓冲区,这意外着两个协程必须都准备好收发后通道才能进行通信,反之只要任何一方没有准备好通道就会阻塞。原创 2021-10-06 15:44:12 · 184 阅读 · 0 评论