
go
文章平均质量分 70
勇敢的菜鸡
一只菜鸡的隐秘角落
展开
-
Golang应用专题 - channel
1、channel的初始化2、channel的关闭3、channel的数据统计当初始化channel不指定通道容量(或指定容量为0)时,该通道为无缓冲channel;1、无缓冲channel的特性2、无缓冲channel的用途3、goroutine泄露当无缓冲channel的发送者goroutine数量和接受者goroutine数量不一致时,会导致较多一方的goroutine阻塞,且无法自动回收(goroutine不会自动被回收),造成goroutine泄露当初始化channel时指定通道容量,该通道为有原创 2022-06-25 20:24:31 · 1118 阅读 · 0 评论 -
记一次go-panic引发的消息堆积
背景业务上使用生产-消费模式处理第三方上报的异步消息;job服务作为消费者,以常驻线程的方式,统一消费各个topic的消息(业务使用kafka做消息队列),然后通过同步调用业务接口使消息生效,数据流大致如下:一条异常消息引发的惨案一天中午,在uat环境出现队列消息堆积、数据无写入的现象,快速定位到job-service服务容器一直处于重启中,无法正常工作;通过重启日志,发现一个topic的消费者在消费某条消息时panic,导致整个job服务宕机,虽然discovery服务检测到心跳异常后不断重启,但原创 2022-05-22 17:03:50 · 862 阅读 · 0 评论 -
Golang -内存管理
内存分配Golang在程序启动时预先向操作系统申请内存,包括:arena即堆区,应用中需要的内存都从这里分配,大小为512G为了方便内存的管理,arena区内存被分成一个个的page,页, 每个页大小为8KB, 整个arena共512G / 8K = 64M个页bitmap即位图区,存放内存管理中所有的位图信息16G?spans即所有已创建的span的指针列表(下文会介绍span的概念和功能)每个Span指向一个page,故spans大小为64M * 8B = 512MB;原创 2022-05-02 16:58:49 · 1350 阅读 · 0 评论 -
Golang - GMP模型
线程池的缺陷我们以网络模型为例。互联网早起的网络模型有PPC和TPC:PPC: 即Process Per Connection, 每个网络连接都新fork一个进程来处理TPC: 即Thread Per Connection, 每个网络连接都新建一个线程来处理不管是fork进程还是新建线程,都存在较大的系统开销(线程相对更小),于是工程师们想到了PreFork和PreThread网络模型:PreFork, 即预先创建好进程,新网络连接到来之后直接使用之前新建的进程,而不用临时创建,降低网络请求原创 2022-04-23 23:13:40 · 2794 阅读 · 0 评论 -
Golang编译过程
了解编译过程的出发点,是在看一些源码的过程中,不知道内建函数的执行原理,比如:定义ch := make(chan int64, 10),在执行中到底是通过哪段源码实现的呢?基于以上疑惑,这篇笔记大致了解下Golang的编译过程几个基本概念抽象语法树ASTAST, Abstract Syntax Tree, 是源代码语法的结构的一种抽象表示,它用树状的方式表示编程语言的语法结构。编译器在执行完语法分析之后会输出一个抽象语法树,这个抽象语法树会辅助编译器进行语义分析,我们可以用它来确定语法正确的程原创 2021-10-10 16:29:01 · 461 阅读 · 0 评论 -
Golang源码阅读笔记 - Defer
讲到defer,首先需要了解它的使用规则,defer语句满足三个原则:defer规则1. 延迟函数的参数在defer函数出现时就已经确定下来了func test1() { i := 0 defer fmt.Println(i) i++ return}=> 打印结果为0如上实验函数1,在defer出现时延迟函数fmt.Println的参数i的值就已经确定了,此时是0;所以即便defer后更新了i的值,最终defer打印的结果仍然为0func test2(){ i := map原创 2021-10-01 20:33:48 · 270 阅读 · 0 评论 -
Golang源码阅读笔记 - Slice
写在前面:slice底层实现的源码相对简单,但是会涉及到一些基础数据结构和函数的调用比较复杂,基础数据类型如_type, 函数如mallocgc()等。鉴于主线优先原则,过于复杂的调用在阅读过程中不做深入剖析,仅理解其主要功能,下面记录下源码阅读中涉及到的基础数据结构和函数功能:type _type struct{...}: 表示数据类型的结构体mallocgc(size uintptr, typ *_type, needzero bool) unsafe.Pointer {...}: 分配内存函数原创 2021-05-25 01:41:02 · 404 阅读 · 1 评论 -
Golang Map并发特性
package foundationimport ( "fmt" "strconv" "sync" "time")/* map 未初始化时,默认是是nil,无法直接赋值,需要先用make初始化 1. testDefaultNil() map 测试被赋值后的地址变化 1. testAssign() * map整体被赋值后,内存地址更新为新map的地址 map不是协程安全,会出现并发读写问题 1. 并发读 testReadSync() succeed 可以 2原创 2021-05-06 21:38:56 · 205 阅读 · 0 评论 -
Golang源码阅读笔记 - reflect
之前在golang底层代码和业务代码中经常见到使用反射,感觉对反射的使用和理解一知半解,所以这篇笔记看下reflect底层代码的实现,加深对反射机制的理解反射包中主要包含两个文件用以描述反射涉及的功能:type.go: 类型;空接口类型描述, eface._typevalue.go: 值;空接口值描述,eface.data下面从这两个方向,分别介绍反射如何获取接口类型和接口值Typereflect.TypeOf(i interface{})可以获取反射后得到的类型变量,我们就从TypeOf(原创 2021-09-11 22:09:01 · 470 阅读 · 0 评论 -
Golang源码阅读笔记 - Context
Context作为golang中用于上下文控制的载体,其应用场景非常普遍,尤其在web开发中,Context更是随处可见。鉴于之前没有深入理解Context的实现原理,以及最近困惑于Context如何携带参数(Value),这篇笔记就来深入阅读下Context的源码,了解其原理ContextContext是接口类型,主要规范了四个方法type Context interface { // 1. Deadline() 返回该Context何时被取消 // 2. 当Context未设置截止时间时,o原创 2021-09-08 00:41:20 · 200 阅读 · 0 评论 -
Golang源码阅读笔记 - Channel
底层数据结构type hchan struct { qcount uint // channel以后数据大小 dataqsiz uint // channel大小 buf unsafe.Pointer // 有缓存的channel,其buf地址 elemsize uint16 closed uint32 elemtype *_type // channel中元素类型 sendx uint // 发送队列索引 recvx uint // 接收队列索引原创 2021-07-26 00:29:12 · 165 阅读 · 0 评论 -
Golang源码阅读笔记 - Sync.Map
sync.Map 底层数据结构// sync.map底层数据结构type Map struct { mu Mutex read atomic.Value dirty map[interface{}]*entry misses int}// read数据结构type readOnly struct { m map[interface{}]*entry amended bool // true if the dirty map contains some key not in原创 2021-07-03 19:27:46 · 271 阅读 · 0 评论 -
Golang源码阅读笔记 - Map
Map底层数据结构type hmap struct { count int // map中元素个数,len()函数返回 flags uint8 B uint8 // map中的bucket的对数值,真实bucket数为2 ^ B个 noverflow uint16 // 溢出bucket的数量 hash0 uint32 // hash seed buckets unsafe.Pointer // Buckets数组的指针,count = 0时原创 2021-06-20 17:22:52 · 230 阅读 · 0 评论 -
Golang源码阅读笔记 - String
String用法说明在src/buildin/buildin.go文件中,对golang内建数据类型做了详细的描述,关于string的说明如下:// string is the set of all strings of 8-bit bytes, conventionally but not// necessarily representing UTF-8-encoded text. A string may be empty, but// not nil. Values of string typ原创 2021-06-07 00:06:56 · 693 阅读 · 0 评论 -
Golang编码---一次偶然发现的编码问题
占坑原创 2021-05-05 23:16:50 · 505 阅读 · 0 评论 -
Protocol Buffers
protocol buffers 是一种数据交互规范(感觉类似 json,xml 这种),protobuf跨平台、跨语言(即各种编程语言都有对应的处理包,只要遵从相同的规范,就可以实现编码解码)protoc 用法及参数使用方法: protoc [OPTION] PROTO_FILES参数:-IPATH, --proto_path=PATH: 寻找依赖包的导入路径,可以多次指定,指定 proto_path 时,需要编译的 PROTO_FILES文件必须要在某个 proto_path 中常见原创 2021-02-19 20:30:12 · 1759 阅读 · 1 评论 -
go安装编译问题记录
权限类问题【已解决】open /usr/local/go/pkg/darwin_amd64/runtime/cgo.a: permission denied产生条件编译go文件时产生上述报错原因分析当前用户对go安装包下文件没有访问权限解决方案(解决参考)根据参考方案,只需要将对应目录或者文件修改所属用户如果存在多用户访问,可以尝试修改目录/文件权限chmod -R 777 xxx...原创 2021-02-01 11:05:53 · 1771 阅读 · 0 评论