GoGo
文章平均质量分 74
Go语言学习与总结
1-programmer
这个作者很懒,什么都没留下…
展开
-
Go runtime运行时hacking
排查Go coredump过程中用到的技术总结。栈、调度和调试技巧。原创 2022-08-23 12:54:36 · 397 阅读 · 0 评论 -
Go阻塞通道的一个小坑
0x01 问题阻塞类型chan就是使用make时,只指定一个类型,不指定长度,或者长度指定为0。它有如下要求:发送方和接受方都准备好时,才能工作。所以想到了如下场景:发送方和使用方都使用select非阻塞方式,会有什么现象?即如下代码:是否会有输出?package mainimport "fmt"import "time"func main() { c := make(chan int) go func() { f原创 2022-04-09 13:10:06 · 487 阅读 · 0 评论 -
Go非阻塞通道探究
title: Go非阻塞通道探究date: 2022-04-08 20:33:26author: linlintags:gocatergories:编程语言0x01 通道阻塞介绍了解Go的同学都清楚,无论通道是有无缓冲的,发送或者接收某些场景下都有可能阻塞。对于无缓冲:默认阻塞,直到对方也准备好接收或者发送。有缓冲:通道满了,发送阻塞。通道空了,接收阻塞。有意思的是,Go里提供了基本的非阻塞接收方式,但没有提供非阻塞的发送方式。可以使用如下方式非阻塞接收。通过判.原创 2022-04-08 22:00:55 · 652 阅读 · 0 评论 -
kubebuilder 上手体验
§ 0x01 kubebuilder是什么?kubebuilder以下简称kb,是k8s社区编写CRD的工具。它可以自动化生成CRD工程代码,提高编写operator的效率。官网的示例CronJob对于初学者来说太复杂了,我试了下,基本的代码可以运行起来。§ 0x02 与sdk-operator的区别是什么?应该是sdk-operator比较先出现,kubebuilder是后来者。极客时间上学习k8s时,张磊还没有提及kubebuilder。两者没有什么本质区别,不过看知乎中的说法,两者社区有融合的趋原创 2022-04-05 17:45:33 · 1971 阅读 · 0 评论 -
Go run permission denied的问题分析与解决方案
0x01 问题一次同事反馈在环境中,执行go run xx.go时出现如下异常提示。fork/exec /tmp/go-build104992250/b001/exe/h: permission denied有点兴趣,所以就动手查了下。查的过程比较简单,但思路有点意思。希望会有所帮助启发。0x02 分析出现这个问题,原因是go在/tmp目录下生成的可执行文件没有执行权限,当Go去执行时就会报错。为什么会没有执行权限呢?请教了同事之后,确认了开发环境中的/tmp的挂载选项中如下所示。tmpf原创 2022-03-30 21:51:06 · 3282 阅读 · 1 评论 -
Go源码阅读3-bytes包
0x01 bytes包bytes包是用来处理byte切片的,与strings包是等同的。所以这个包基本上平时很少用到,大家用的多都是strings包。因为字符串更容易被大家理解。但源码中的一些优秀的做法,还是非常值得学习的。0x02 细节2.1 bytes比较通过源码看到,bytes的比较是转换为string后进行的。注意点是,nil和空切片比较是相等的。这一点可能很多人没注意到。可以通过如下的函数可以验证。func eq() { b1 := make([]byte, 0, 1)原创 2022-03-29 09:16:52 · 508 阅读 · 0 评论 -
Linux 4.xx内核+Go 1.15出core排查
Go runtime出core在使用gozero框架的开发数据库管理服务的过程中,经常出core。通过dlv查看core的位置,各个地方都有,典型的有以下两种:runtime在执行init函数时,某个空串对应的地址上其长度不对,应该是0,却是一个负值。runtime中初始化timer时,timer的某个应该为正整数的属性,变成了负值。明确是踩了内存,但一时间找不到思路。0x01 怀疑是CGO由于CGO和Go本身使用的内存模型不同,CGO比较容易出现踩内存的问题。加上出core的程序,为了使用原创 2022-03-28 11:55:19 · 845 阅读 · 0 评论 -
非递归的堆排序
0x01 背景多年之前写了一篇博客,实现非递归方式的堆排序,多年之后才发现写的有问题。连忙撤了下来,重新复习了《算法导论》,用Go实现了正确的非递归排序。算是填上了当年的坑。基本上是复原了书上的实现,加上自己的理解。0x02 堆与堆排序堆是一种完全二叉树。它具有如下特点:每个节点都比其他子节点的值大或者小。都大的叫大根堆,都小的叫小根堆。反过来表达,除根节点外,其他节点都比父节点小或者大。堆可以和一个数组对应起来。下标为i的元素的两个子节点分别为2i+1和2i+2。堆排序就是利用堆的构建过原创 2022-03-27 15:17:59 · 997 阅读 · 0 评论 -
mit 6.824 Raft练习作业笔记
Raft算法实践原创 2022-03-24 17:47:33 · 614 阅读 · 0 评论 -
Go源码阅读2-bufio
§ 0x01 学习语言的方法不知道某个细节该怎么写时:自己想,去推测。带着问题,去看源码。带着问题,去请教有经验的人。 导师或者周围的人。学习的点:代码布局;函数实现与抽象;通过的编程范式如何使用;其他意外的收获。§ 0x02 bufio上一篇为介绍看archive的总结:https://my.oschina.net/linhaha/blog/5120097Q1: 常量定义放在头部还是靠近使用的位置?A1:靠近使用的位置。可以看bufio.go。const minRead原创 2022-03-24 15:25:36 · 143 阅读 · 0 评论