![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
自学GO语言
文章平均质量分 87
inet_ygssoftware
西南大学毕业 在各种大厂游荡 也是大厂中的工具人 各种架构设计 工具类封装 开源组件分享 职业生涯中都接触和参与其中
展开
-
golang-context
标题golang-context1. context 常用方法,以及各种适用于什么场景1.1 context含有的方法 var ctx context.Context var cancel context.CancelFunc // 1,传递key,value的值 ctx = context.WithValue(context.Background(), "key", "value") // 2,超时控制timeout ctx, cancel = context.WithTimeout(co原创 2021-06-11 15:49:18 · 26483 阅读 · 1 评论 -
Go的内存管理(最新学习)
标题Go的内存管理内存管理的设计内存空间有堆区和栈区。栈一般存储局部变量,方法有关的数据,由编译器自动管理,。堆用来存放对象,java和go都是通过垃圾收集器回收,不需要手动对内存进行释放和管理。内存管理一般包含三个组件应用程序内存分配器垃圾收集器内存分配器应用程序通过内存分配器申请内存,内存分配器从堆中初始化相应的内存区域。分配方法内存分配器一般包含两种分配方法线性分配器空闲链表分配器线性分配器Java就是使用的线性分配器的思想。使用线性分配器时,只需要在内存中维护一原创 2021-06-11 15:30:03 · 26550 阅读 · 0 评论 -
限流算法, 以 Golang 方式
限流算法, 以 Golang 方式速率限制在 Web Server、TCP 通讯、API 交互等领域中,速率限制,Rate Limit,一般是面向请求次数、流量等参数进行速率控制。有的时候它又被称作流量控制。谈论流量控制时,大抵上要考虑到如下两个方面:恒定速率(Constant Bit Rate,CBR)变速速率(Varible Bit Rate,VBR)这并不是 TCP 通讯专有的概念。事实上,速率控制是个跨越多学科存在的通用概念。例如在音视频播放时(特别是在流媒体播放时),解码速率也是需原创 2021-06-11 15:12:01 · 27219 阅读 · 1 评论 -
grpc-go客户端源码分析
grpc-go客户端源码分析代码讲解基于v1.37.0版本。和grpc-go服务端源码分析一样,我们先看一段示例代码,const ( address = "localhost:50051" defaultName = "world")func main() { // Set up a connection to the server. conn, err := grpc.Dial(address, grpc.WithInsecure(), grpc.WithBlock())原创 2021-06-11 15:02:30 · 27264 阅读 · 2 评论 -
Golang面向并发的内存模型
Golang面向并发的内存模型在早期,CPU都是以单核的形式顺序执行机器指令。Go语言的祖先C语言正是这种顺序编程语言的代表。顺序编程语言中的顺序是指:所有的指令都是以串行的方式执行,在相同的时刻有且仅有一个CPU在顺序执行程序的指令。随着处理器技术的发展,单核时代以提升处理器频率来提高运行效率的方式遇到了瓶颈,目前各种主流的CPU频率基本被锁定在了3GHZ附近。单核CPU的发展的停滞,给多核CPU的发展带来了机遇。相应地,编程语言也开始逐步向并行化的方向发展。Go语言正是在多核和网络化的时代背景下诞生原创 2021-06-07 11:04:40 · 39355 阅读 · 0 评论 -
Golang的调度模型
Golang中的内存模型The Go memory model specifies the conditions under which reads of a variable in one goroutine can be guaranteed to observe values produced by writes to the same variable in a different goroutine.翻译过来就是说,Go内存模型通过定义以下的条件,来保证在一个goroutine可以观察到另外原创 2021-06-07 10:28:18 · 39369 阅读 · 0 评论 -
gRPC-go源码(2):ClientConn
gRPC-go源码(2):ClientConn摘要在上一篇文章中,我们聊了聊gRPC是怎么管理一条从Client到Server的连接的。我们聊到了gRPC拥有Resolver,用来解析地址;拥有Balancer,用来做负载均衡。在这一篇文章中,我们将从代码的角度来分析gRPC是怎么设计Resolver和Balancer的,并会从头到尾的梳理一遍连接是怎么建立的。1 DialContextDialContext是客户端建立连接的入口函数,我们看看在这个函数里面做了哪些事情:func DialCo原创 2021-06-07 10:59:46 · 39560 阅读 · 0 评论 -
gRPC-go源码(1):连接管理
gRPC-go源码(1):连接管理1 写在前面在这个系列的文章中,我们将会从源码的层面学习和理解gRPC。整个系列的文章的计划大概是这样的:我们会先从客户端开始,沿着调用路径逐步分析到服务端,以模块为粒度进行学习,考虑这个模块是为了解决什么问题,然后思考gRPC应该怎么去解决这个问题。在分析完这部分的架构设计后,我们会在接下来的一篇文章中研究具体的代码实现。因此,这个系列的文章不会像之前的源码分析那样贴一大段的代码,然后加上注释。这样做不但使得阅读成本很高,而且很难学到除了代码实现以外的东西。我们原创 2021-06-07 10:49:03 · 39782 阅读 · 0 评论 -
gRPC-go 入门(1):Hello World
gRPC-go 入门(1):Hello World摘要在这篇文章中,主要是跟你介绍一下gRPC这个东西。然后,我会创建一个简单的练习项目,作为gRPC的Hello World项目。在这个项目中,只有很简单的一个RPC函数,用于说明gRPC的工作方式。此外,我也会跟你分享一下我初次接触gRPC所遇到的一些坑,主要是在protocol buffer的proto-gen-go插件上面。简单介绍在这一节的内容中,我将简单的跟你介绍一下gRPC这个东西。 RPC的全称是Remote Procedur原创 2021-06-06 00:29:01 · 65629 阅读 · 4 评论 -
Golang Web入门(4):如何设计API
Golang Web入门(4):如何设计API摘要在之前的几篇文章中,我们从如何实现最简单的HTTP服务器,到如何对路由进行改进,到如何增加中间件。总的来讲,我们已经把Web服务器相关的内容大概梳理了一遍了。在这一篇文章中,我们将从最简单的一个main函数开始,慢慢重构,来研究如何把API设计的更加规范和具有扩展性。1 构建一个Web应用我们从最简单的开始,利用gin框架实现一个小应用。在这这篇文章中,我先不使用MySQL和Redis,缓存和持久化相关的内容我将在以后的文章中提到。在这个系列中,我原创 2021-06-07 10:11:04 · 39910 阅读 · 0 评论 -
Golang Web入门(3):如何优雅的设计中间件
Golang Web入门(3):如何优雅的设计中间件摘要我们上篇文章已经可以实现一个性能较高,且支持RESTful风格的路由了。但是,在Web应用的开发中,我们还需要一些可以被扩展的功能。因此,在设计框架的过程中,应该留出可以扩展的空间,比如:日志记录、故障恢复等功能,如果我们把这些业务逻辑全都塞进Controller/Handler中,会显得代码特别的冗余,杂乱。所以在这篇文章中,我们来探究如何更优雅的设计这些中间件。1 耦合的实现方式比如我们要实现一个日志记录的功能,我们可以用这种简单粗暴的原创 2021-06-07 09:47:32 · 39625 阅读 · 0 评论 -
Golang Web入门(2):如何实现一个RESTful风格的路由
Golang Web入门(2):如何实现一个RESTful风格的路由摘要在上一篇文章中,我们聊了聊在Golang中怎么实现一个Http服务器。但是在最后我们可以发现,固然DefaultServeMux可以做路由分发的功能,但是他的功能同样是不完善的。由DefaultServeMux做路由分发,是不能实现RESTful风格的API的,我们没有办法定义请求所需的方法,也没有办法在API路径中加入query参数。其次,我们也希望可以让路由查找的效率更高。所以在这篇文章中,我们将分析httprouter这个原创 2021-06-07 09:38:38 · 39919 阅读 · 0 评论 -
Golang Web入门(1):自顶向下理解Http服务器
Golang Web入门(1):自顶向下理解Http服务器摘要由于Golang优秀的并发处理,很多公司使用Golang编写微服务。对于Golang来说,只需要短短几行代码就可以实现一个简单的Http服务器。加上Golang的协程,这个服务器可以拥有极高的性能。然而,正是因为代码过于简单,我们才应该去研究他的底层实现,做到会用,也知道为什么这么用。在本文中,会以自顶向下的方式,从如何使用,到如何实现,一点点的分析Golang中net/http这个包中关于Http服务器的实现方式。内容可能会越来越难理解,原创 2021-06-07 09:32:01 · 39731 阅读 · 1 评论 -
Golang入门(4):并发
Golang入门(4):并发摘要并发程序指同时进行多个任务的程序,随着硬件的发展,并发程序变得越来越重要。Web服务器会一次处理成千上万的请求,这也是并发的必要性之一。Golang的并发控制比起Java来说,简单了不少。在Golang中,没有多线程这一说法,只有协程,而新建一个协程,仅仅只需要使用go关键字。而且,与Java不同的是,在Golang中不以共享内存的方式来通信,而是以通过通信的方式来共享内存。这方面的内容也比较简单。1 线程与协程在Golang中,并发是以协程的方式实现的。在Java原创 2021-06-07 09:28:45 · 39823 阅读 · 4 评论 -
Golang入门(3):一天学完GO的进阶语法
摘要在上一篇文章中,我们聊了聊Golang中的一些基础的语法,如变量的定义、条件语句、循环语句等等。他们和其他语言很相似,我们只需要看一看它们之间的区别,就差不多可以掌握了,所以作者称它们为“基础语法”。在这篇文章中,我们将聊一聊Golang的一些语言特性,这也是Golang和其他语言差别比较大的地方。除此之外,还有一部分内容是关于Golang的并发,这一部分将在下一篇文章中介绍。1 结构体在Java中,我们已经体会过了面向对象的方便之处。我们只需要将现实中的模型抽象出来,就成为了一个类,类里面定义了原创 2021-06-07 09:19:17 · 41216 阅读 · 2 评论 -
Golang入门(1):安装与配置环境变量的意义
摘要在几年前学习Java的时候,环境的配置就会劝退一部分的初学者。而对于Golang来说,也需要从环境的配置开始学起。这一篇文章将从如何安装Golang开始讲起,随后将会提到Golang中的环境变量GOROOT和GOPATH的配置以及这两个环境变量起到什么样的效果。下面开始:安装和其他语言的安装类似,golang的安装我们也可以采用三种方式进行,从简单到复杂依次是通过可执行文件的安装、官方二进制包安装和源码编译安装。我们可以在这里获取最新版本的go安装文件。在这里解释一下,其实二进制文件的安装和原创 2021-06-06 00:36:06 · 65302 阅读 · 2 评论 -
Golang入门(2):一天学完GO的基本语法
摘要在配置好环境之后,要研究的就是这个语言的语法了。在这篇文章中,作者希望可以简单的介绍一下Golang的各种语法,并与C和Java作一些简单的对比以加深记忆。因为这篇文章只是入门Golang的第二篇文章,所以本文并不会对一些指令进行深挖,仅仅只是停留在“怎么用”的程度,至于“为什么是这样”,则涉及到了具体的应用场景和汇编指令,作者将会在以后的文章中进行介绍。1 导包总所周知,“Hello World”是程序员的一种仪式感。而这一行“Hello World”,一定会涉及到输入输出相关的方法。所以,如原创 2021-06-06 00:31:15 · 75321 阅读 · 7 评论