Go语言三十讲【目录】

2022-10-24
阅读 1 分钟
4.4k
第一章 Go语言快速入门  第一篇 基本语法  第二讲 数组与切片  第三讲 字符串  第四讲 哈希表MAP  第五讲 结构体与接口  第六讲 反射  第七讲 泛型第二章 并发编程  第八讲 GMP调度模型  第九讲 协程管理  第十讲...

【5-6 Golang】实战—平滑升级

2022-10-24
阅读 7 分钟
1.6k
  Go服务作为常驻进程,想升级怎么办?你是不是想说这还不简单,先杀掉老的服务,再启动新的服务不就完了。可是你有没有想过,在你杀掉老服务的时候,正在处理的请求怎么办?以及老服务退出新服务启动的过程中,客户端请求到达了怎么办?这一简单粗暴的操作,必然会引起瞬时的请求异常。那怎么办,想办法平滑...

【5-5 Golang】实战—Go微服务发现问题分析

2022-10-24
阅读 10 分钟
1.1k
  某个夜黑风高的晚上,突然接收到少量错误日志报警『failed to dial server: dial tcp xxxx:yy: i/o timeout』。原来是微服务客户端请求服务端,连接失败。

【5-4 Golang】实战—Go服务502总结

2022-10-24
阅读 11 分钟
2k
问题引入  生产环境Golang服务有时会产生502报警,排查发现大多是以下三种原因造成的:http.Server配置了WriteTimeout,请求处理超时,Golang服务断开连接;http.Server配置了IdleTimeout,且网关和Golang之间使用长连接,Golang服务主动断开连接;Golang服务处理HTTP请求时出现了panic。  本篇文章...

【5-3 Golang】实战—HTTP服务假死问题分析

2022-10-24
阅读 5 分钟
939
  下午15点左右,QA反馈灰度环境大量请求超时。kibana查询灰度网关日志,确实存在部分请求响应时间超过60秒,HTTP状态码504。进一步分析日志,所有504请求的上游地址都是xxxx:80。

【5-2 Golang】实战—dlv调试

2022-10-21
阅读 8 分钟
3.5k
  Go程序出异常怎么办?pprof工具分析啊,可是如果是代码方面bug等呢?分析代码bug有时需要结合执行过程,加日志呗,可是某些异常问题服务重启之后,可能会很难复现。这时候我们可以断点调试,这样就能分析每一行代码的执行,每一个变量的结果,C语言通常使用GDB调试,Go语言有专门的调试工具dlv,本篇文章主...

【5-1 Golang】实战—Go程序分析利器pprof

2022-10-20
阅读 11 分钟
1.9k
  不知道你有没有遇到这种情况,Go服务总是是不是的响应非常慢排查发现所有的依赖还都挺快,感觉是Go服务自身慢又不知道怎么慢在哪里;或者说请求甚至完全没响应,Go服务明明在正常运行,请求去哪儿了呢?或者说Go服务内存占用总是居高不下,内存都浪费在哪呢?这些问题都可以通过pprof分析,本篇文章将为你演...

【4-4 Golang】常用标准库—单元测试

2022-10-19
阅读 8 分钟
734
  日常项目开发中,单元测试是必不可少的,Go语言本身就提供了单元测试标准库,很方便我们开展基础测试,性能测试,事例测试,模糊测试以及分析代码覆盖率,本篇文章主要介绍Go单元测试的基本操作。

【4-3 Golang】常用标准库—上下文context

2022-10-18
阅读 8 分钟
1.1k
  Context顾名思义上下文,可用于在整个请求上下文传值以及控制超时,本篇文章主要介绍Context的设计思路,以及基本使用方式。

【4-2 Golang】常用标准库—net/http.client

2022-10-17
阅读 10 分钟
2.6k
  Go语言中,当我们需要访问第三方服务时,通常基于http.Client完成,顾名思义其代表HTTP客户端。http.Client的使用相对比较简单,不过底层有一些细节还是要多注意,包括长连接(连接池问题),可能偶现的reset情况等等。本篇文章主要介绍http.Client的基本使用方式,实现原理,以及一些注意事项。

【4-1 Golang】常用标准库—net/http.server

2022-10-14
阅读 9 分钟
1.7k
  Go语言创建HTTP服务还是非常方便的,基于http.Server几行代码就能实现,本篇文章主要介绍http.Server的基本使用方式以及HTTP请求处理流程。当然,目前很多web服务都基于gin框架实现,所以我们也会简单介绍下gin框架的一些使用套路。

【3-4 Golang】GC—调度与调优

2022-10-13
阅读 10 分钟
1.7k
  关于垃圾回收的基本知识已经介绍的差不多了,只是要知道垃圾回收过程是需要耗费CPU时间的,那就有可能会影响到用户协程的调度,所以在某些场景需要垃圾回收相关调优。本篇文章主要介绍垃圾回收的触发时机,以及垃圾回收器的几种调度模式,只有了解这些才能知道如何调优;最后结合常用的缓存框架bigcache,分...

【3-3 Golang】GC—标记 清理

2022-10-12
阅读 9 分钟
1.4k
  上一篇文章我们主要介绍了三色标记法与写屏障技术,基于这些基础,本篇文章将重点介绍垃圾回收的整个处理流程(开启-标记-标记结束-清理),包括标记协程主流程,经典的startTheworld/stopTheworld问题,辅助标记是什么,清理过程等等。

【3-2 Golang】GC—三色标记与写屏障

2022-10-11
阅读 8 分钟
1.9k
  垃圾回收就是找出不再使用的对象并回收这些内存。如何找出呢?这就不得不说一下三色标记法,这是Go语言垃圾回收的基础。本篇文章主要介绍三色标记法,包括三色标记算法,写屏障技术;以及Go语言是如何实现三色标记和写屏障的。

【3-1 Golang】GC—内存管理

2022-10-10
阅读 8 分钟
1.7k
  Go语言为我们做了很多,创建对象不再需要我们手动申请内存,也不用考虑对象使用完后释放内存,这些对开发者来说都是透明的;但是作为一名Go开发者,内存管理和垃圾回收还是有必要深入研究的。毕竟,内存与CPU是程序高效运行的基础。

【2-9 Golang】Go并发编程—并发编程

2022-10-09
阅读 7 分钟
1.7k
  Go语言为我们提供了基于消息传递CSP并发模型,基于管道 + 协程可以很方便的编写高并发服务,但是在某些场景下,或多或少还是需要使用到锁,本篇文章主要介绍除了管道chan之外的常见并发编程模式。

【2-8 Golang】Go并发编程—panic defer recover

2022-10-08
阅读 7 分钟
1.2k
  在Go程序中defer特别常见,通常用来执行一些清理工作,需要注意defer先入后出特性(先声明的后执行);panic意味着一些出乎意料的错误发生,Go程序在panic异常退出的时候,会打印运行时栈方便排查问题;panic的错误可以被recover捕获,从而避免Go程序的退出,但是要注意recover只能在defer中,其他任何地方...

【2-7 Golang】Go并发编程—系统调用

2022-09-30
阅读 5 分钟
1.8k
  还记得GMP协程调度模型吗?M是线程,G是协程,P是逻辑处理器,线程M只有绑定P之后才能调度并执行协程G。那如果用户协程中执行了系统调用呢?我们都知道执行系统调用会发生用户态到内核态切换,而且系统调用也有可能会阻塞线程M。M阻塞了还怎么调度协程呢?万一所有的线程M都因系统调用阻塞了呢?阻塞期间谁...

【2-6 Golang】Go并发编程—定时器timer

2022-09-29
阅读 6 分钟
2k
  定时器使得我们可以延迟若干时间执行某项任务,或者以某一时间周期性执行某项任务,Linux系统本身也具备定时器能力,Go语言是定时器是基于系统调用实现的吗?另外,Go语言不是多协程吗,定时器触发时,是在哪个协程执行任务的呢?创建任务的协程吗?

【2-5 Golang】Go并发编程—管道chan

2022-09-28
阅读 10 分钟
2.3k
  Go语言实现了两种多线程同步方案,一种是传统多线程语言类似,基于共享内存方案;另一种称之为基于协程-管道的CSP(communicating sequential processes)并发编程模型,这也是Go语言推荐的方式。本篇文章主要讲解管道在并发编程中的典型应用,以及管道的底层实现原理。

【2-4 Golang】Go并发编程—网络IO

2022-09-27
阅读 9 分钟
2.2k
  我们都知道用户程序读写socket的时候,可能阻塞当前协程,那么是不是说明Go语言采用阻塞方式调用socket相关系统调用呢?你有没有想过,Go语言又是如何实现高性能网络IO呢?有没有使用传说中的IO多路复用,如epoll呢?

【2-3 Golang】Go并发编程—调度器schedule

2022-09-26
阅读 8 分钟
1.5k
  我们一直提到,每一个线程都有一个线程栈,也称为系统栈;协程g0就运行在这个栈上,而且协程g0执行的就是调度逻辑schedule。Go语言调度器是如何管理以及调度这些成千上万个协程呢?和操作系统一样,维护着可运行队列和阻塞队列吗,有没有所谓的按照时间片或者是优先级或者是抢占式调度呢?

【2-2 Golang】Go并发编程—协程管理

2022-09-23
阅读 11 分钟
1.8k
  上一篇文章我们介绍了GMP并发模型的基本概念,知道了M是线程,P是逻辑处理器,G是协程。也了解到每一个M线程都有一个调度协程g0,调度主逻辑由函数schedule实现;协程都有自己的协程栈,协程的切换其实就是协程栈的切换,其实就是若干寄存器的保存与恢复。本篇文章重点介绍协程的管理,包括协程创建,协程切...

【2-1 Golang】Go并发编程—GMP调度模型概述

2022-09-22
阅读 7 分钟
1.6k
  Go语言天然具备并发特性,基于go关键字就能很方便的创建协程去执行一些并发任务,而且基于协程-管道的CSP并发编程模型,相比于传统的多线程同步方案,可以说简单太多了。从本篇文章开始,将为大家介绍Go语言的核心:并发编程;不仅包括协程/管道/锁等的基本使用,还会深入到协程实现原理,GMP协程调度模型等。

【1-7 Golang】Go语言快速入门—泛型

2022-09-21
阅读 5 分钟
1.4k
  Golang在1.18版本支持了泛型,写过java/c++等语言的可能对泛型有一定的了解。那么泛型到底是什么呢?他有什么作用呢?

【1-6 Golang】Go语言快速入门—反射

2022-09-20
阅读 11 分钟
1.4k
  反射使得Go语言具备一些动态特性,比如不知道参数类型怎么办?当然你可以定义多个函数,分别传递不同参数;你也可以定义一个函数就行,参数类型为interface{},函数内通过反射操作变量。一些rpc框架,通常使用反射注册服务方法,以及通过反射调用服务方法。

【1-5 Golang】Go语言快速入门—结构体与接口

2022-09-19
阅读 11 分钟
1.3k
  Go语言支持面向对象编程,但是又和传统的面向对象语言如C++,Java等略有不同:Go语言没有类class的概念,只有结构体strcut,其可以拥有属性,可以拥有方法,我们可以通过结构体实现面向对象编程。Go语言也有接口interface的概念,其定义一组方法集合,结构体只要实现接口的所有方法,就认为其实现了该接口,...

【1-4 Golang】Go语言快速入门—哈希表MAP

2022-09-16
阅读 14 分钟
1.5k
  map又称为hash表、字典,存储键值对,其增删改查时间复杂度可以达到O(1)。map和切片是Go语言开发最常用的数据类型。

【1-3 Golang】Go语言快速入门—字符串

2022-09-15
阅读 6 分钟
1.4k
  Go语言字符串的用法还是比较简单的,常用也就是字符串相加,字符串与byte切片、rune切片互相转换,字符串输出等等操作。那有什么可学的呢?其实还是有一些细节需要关注,比如字符串"只读"特性,字符串编码等等。

【1-2 Golang】Go语言快速入门—数组与切片

2022-09-14
阅读 10 分钟
2.4k
  数组和切片是Go语言提供的两种基本数据结构,数组的概念大家应该都很熟悉,相同类型元素的集合,且元素在内存中连续存储,可以非常方便的通过下标访问数组元素;那么什么是切片呢?切片可以理解为动态数组,也就是说数组长度(最大可以存储的元素数目)可以动态调整。切片是我们日常开发最常用的数据结构之...