常见 IO 模型研究

核心信息 IO 发生时涉及的对象和步骤。对于一个 network IO (这里我们以 read 举例),它会涉及到两个系统对象,一个是调用这个 IO 的 process (or thread),另一个就是系统内核 (kernel)。当一个 read 操作发生时,它会经历两个阶段: 等待数据准备 (Waiting for the data to be ready) 将数据从内核拷贝到进程中 (Copying the data from the kernel to the process) 记住这两……

阅读全文

go map 无序原因

连续两次被问到 map 遍历输出无序的原因 看过数据结构的我自信的回答:应为底层是散列表,没有顺序表内存上的连续,也没有链表逻辑上的前后继关系。 面试官笑得很诡异,而且就到此为止了。 直到我看到这段代码: ... // decide where to start r := uintptr(fastrand()) if h.B > 31-bucketCntBits { r += uintptr(fastrand()) << 31 } it.startBucket = r & bucketMask(h.B) it.offset = uint8(r >> h.B & (bucketCnt - 1)) // iterator state it.bucket = it.startBucket 遍历过程中……

阅读全文

goroutine 协程数目限制

协程属于用户态线程,逻辑由用户代码控制。 系统本身不对 goroutine 数目进行限制。 虽然 golang 中协程开销很低,但是在一些情况下还是有必要限制一下协程的开启数,如果你的协程数太过庞大,可能出现: 系统资源占用率不断上涨 输出一定数量后:控制台就不再刷新输出最新的值了 信号量:signal: killed 解决方式: buffered channel +……

阅读全文

buffer 和 cache 的区别

简单总结 cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快访问速度的作用。 而 buffer 的主要目的进行流量整形,把突发的大数量较小规模的 I/O 整理成平稳的小数量较大规模的 I/O,以减少响应次数(比如从网上下电影,你不能下一点点数据就写一下硬盘,而是积攒一定量的数据以后一整块一起写……

阅读全文

kubernetes 节点和核心资源

1. Master 集群控制节点 3 个核心进程: kube-apiserver: 提供了 HTTP Rest 接口的关键服务进程,是资源操作的唯一入口, 并提供认证、授权、访问控制、API 注册和发现等机制; 是集群的入口程序 kube-controller manager: 所有资源对象的自动化控制:负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;……

阅读全文

Defer Recover Panic 三剑客

recover() 用于将 panic 的信息捕捉。 recover 必须定义在 panic 之前的 defer 语句中。 在这种情况下,当 panic 被触发时,该 goroutine 不会简单的终止,而是会执行在它之前定义的 defer 语句。 不再执行 panic 之后的语句 总之 使用时 recover 和 defer 搭配,就是三件套 panic->defer->recover 坑 函数嵌套后,defer 嵌套后就不管用 recover 必须放在 defer 中,否则只返回 nil 工作中没实际用过,有空补充点……

阅读全文

Defer 总结

虽说比较常用,但是遇到一道面试题还是比较懵逼,总结一下~ 面试题 下面代码输出什么? package main import "fmt" func calc(index string, a, b int) int { ret := a + b fmt.Println(index, a, b, ret) return ret } func main() { a := 1 b := 2 defer calc("1", a, calc("10", a, b)) a = 0 defer calc("2", a, calc("20", a, b)) b = 1 } /* output 10 1 2 3 20 0 2 2 2 0 2 2 1 1 3 4 */ 关键知识点 defer 是什么? defer 是 Go 语言提供的一种用于注册延迟调用的……

阅读全文

现代垃圾收集策略 —— Go 的 GC 策略

在 Hacker News 和 Reddit 你可以找到相关讨论 我最近看过很多文章,它们以令我困扰的方式推广 Go 语言最新的垃圾收集器。其中一些文章来自 Go 官方项目本身。他们声称这意味着 GC 技术已经有根本性的突破。 这是新版本(Go 1.5)垃圾收集器的首次公告: Go 正在构建一个垃圾收集器(GC),不止适用于 2015 年,甚至适用于 2025 年……

阅读全文

Vet 命令:超出预期的强大

Go vet 命令在编写代码时非常有用。它可以帮助您检测应用程序中任何可疑、异常或无用的代码。该命令实际上由几个子分析器组成,甚至可以与您的自定义分析器一起工作。让我们首先回顾一下内置的分析器。 内置分析器 可以通过命令 go tool vet help 获取 内置分析器 列表。让我们分析一些不太明显的例子,以便更好地理解。……

阅读全文

Go:关于 Cobra 的想法

Cobra 是 Golang 生态系统中最着名的项目之一。它简单,高效,并得到 Go 社区的大力支持。让我们来深入探索一下。 设计 Cobra 中的 Command 是一个具有名称,使用描述和运行逻辑函数的结构体: cmd := &cobra.Command{ Run: runGreet, Use: `greet`, Short: "Greet", Long: "This command will print Hello World", } 设计非常类似于原生的 go 标准库命令,如 go env,go fmt等 比如,go fmt 命令结构: var CmdFmt = &base.Command{ Run: runFmt,……

阅读全文