深度思维者

永远年轻,永远热泪盈眶

摘要: 1. 前言 所谓的逃逸分析(Escape analysis)是指由编译器决定内存分配的位置吗不需要程序员指定。 函数中申请一个新的对象 如果分配在栈中, 则函数执行结束后可自动将内存回收 如果分配在堆中, 则函数执行借宿可交给GC(垃圾回收)处理 有了逃逸分析,返回函数局部变量将变得可能,除此之外, 阅读全文
posted @ 2023-03-15 09:11 failymao 阅读(138) 评论(0) 推荐(1) 编辑
摘要: 1. 前言 kafka作为数据中间键在数据服务解耦,大数据,日志方面堪称一把瑞士军刀,备受青睐,作为提供了一套完整命令行的程序,日常进行调试过程中难免会用到一些指令,现总结18条最常用指令。 2. 常用指令 启动消费者 bin/kafka-console-consumer.sh --bootstra 阅读全文
posted @ 2023-03-10 09:24 failymao 阅读(19) 评论(1) 推荐(1) 编辑
摘要: 1. 问题 golang构建程序很简单,当遇到需要调用c库时,如通常使用 net,kafka, sqlite3 程序运行时就会调用当前服务器的 动态库,如果遇到没有库时,通常还需要 下载比如 alpine需要安装sqlite apk add --no-cache sqlite-libs sqlite 阅读全文
posted @ 2023-03-07 18:25 failymao 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 Go 语言中两个经常成对出现的两个关键字 — panic 和 recover。这两个关键字与上一节提到的 defer 有紧密的联系,它们都是 Go 语言中的内置函数,也提供了互补的功能。 需要说明两点 panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码 阅读全文
posted @ 2021-12-19 23:06 failymao 阅读(779) 评论(0) 推荐(1) 编辑
摘要: 1. 简介 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。 理解这句话主要在三个方面: 当前函数 返回前执行,当然函数可能没有返回值 传入的函数,即 defer 关键值后面跟的是一个函数,包括普通函数如(fmt.Println), 也可以是匿 阅读全文
posted @ 2021-12-19 22:13 failymao 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 一.序 这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分区(partition)数,创建同等数量的 消费者( goroutine)从不同的分区中消费者消费数据,但是总有某种原因导致,某一个分区消费者创建失败,但是其他分区消费者创建失败。 最初的逻辑是,忽略分区失败 阅读全文
posted @ 2021-12-12 00:02 failymao 阅读(564) 评论(1) 推荐(0) 编辑
摘要: 1. 引言 关于闭包的说明,曾在很多篇幅中都有过一些说明,包括Go基础--函数2, go 函数进阶,异常与错误 都有所提到, 但是会发现,好像原理(理论)都懂,但是就是不知道如何使用,或者在看到一些源码时,依然一头雾水。 刚好今天看到了一篇优质的博客,并结合以前几篇关于类似闭包的介绍,再次对 闭包进 阅读全文
posted @ 2021-12-08 00:25 failymao 阅读(406) 评论(2) 推荐(0) 编辑
摘要: 1. 什么是边界检查? 边界检查,英文名 Bounds Check Elimination,简称为 BCE。它是 Go 语言中防止数组、切片越界而导致内存不安全的检查手段。如果检查下标已经越界了,就会产生 Panic。 边界检查使得我们的代码能够安全地运行,但是另一方面,也使得我们的代码运行效率略微 阅读全文
posted @ 2021-12-05 23:12 failymao 阅读(537) 评论(2) 推荐(0) 编辑
摘要: 一.前言 1.1 为什么需要Singleflight? 很多程序员可能还是第一次听说,本人第一次听说这个的时候以为翻译过来就是程序设计中被称为的是 "单例模式"。 google之后二者天壤之别。 一般情况下我们在写一写对外的服务的时候都会有一层 cache 作为缓存,用来减少底层数据库的压力,但是在 阅读全文
posted @ 2021-11-27 22:39 failymao 阅读(1071) 评论(1) 推荐(5) 编辑
摘要: 一.设计原理 Go 语言中最常见的、也是经常被人提及的设计模式就是: "不要通过共享内存来通信,我们应该使用通信来共享内存" 通过共享内存来通信是直接读取内存的数据,而通过通信来共享内存,是通过发送消息的方式来进行同步。 而通过发送消息来同步的这种方式常见的就是 Go 采用的通信顺序进程 CSP(C 阅读全文
posted @ 2021-11-23 00:30 failymao 阅读(1704) 评论(0) 推荐(0) 编辑
摘要: 一. 序言 1.1 场景一 现在有一个 Server 服务在执行,当请求来的时候我们启动一个 goroutine 去处理,然后在这个 goroutine 当中有对下游服务的 rpc 调用,也会去请求数据库获取一些数据,这时候如果下游依赖的服务比较慢,但是又没挂,只是很慢,可能一次调用要 1min 才 阅读全文
posted @ 2021-11-17 01:03 failymao 阅读(890) 评论(0) 推荐(1) 编辑
摘要: 一. 前言 了解 sync.WaitGroup的用法都知道 一个 goroutine 需要等待多个 goroutine 完成和多个 goroutine 等待一个 goroutine 干活时都可以解决问题 WaitGroup 的确是一个很强大的工具,但是使用它相对来说还是有一点小麻烦, 一方面我们需要 阅读全文
posted @ 2021-11-07 23:46 failymao 阅读(1363) 评论(0) 推荐(0) 编辑
摘要: 一.序 单从库名大概就能猜出其作用。sync.Once使用起来很简单, 下面是一个简单的使用案例 package main import ( "fmt" "sync" ) func main() { var ( once sync.Once wg sync.WaitGroup ) for i := 阅读全文
posted @ 2021-11-02 23:28 failymao 阅读(395) 评论(2) 推荐(0) 编辑
摘要: 一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术。 WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束。比如某个goroutine需要等待其他几个goroutine全部完成,那么使用WaitGroup可以轻松实现。 阅读全文
posted @ 2021-11-01 23:46 failymao 阅读(572) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 在学习 mutex后。 在读源码的时候发现里面使用了很多atomaic 包的方法来保证原子。在并发编程中,常常提到的并发安全,具体数据就是 对数据的修改读取是否是原子操作 所以也常说,并发是否能保证了原子操作。在Golang语言中,实现原子操作是在标准库实现的,即 sync/atomic 阅读全文
posted @ 2021-11-01 09:56 failymao 阅读(548) 评论(0) 推荐(0) 编辑
摘要: 一.前言 我们反复提到了goroutine的创建时简单的。 但是仍然要小心, 习惯总是会导致我们可能写出一些bug.对于语言规范没有定义的内容不要做任何的假设。 需要通过同步语义来控制代码的执行顺序 这一点很重要。 这些包提供了一些基础的同步语义,但是在实际的并发编程当中,我们应该使用 channe 阅读全文
posted @ 2021-10-31 22:23 failymao 阅读(367) 评论(0) 推荐(0) 编辑
摘要: 1. 场景 使用windows, wsl2 进行日常开发测试工作。 但是wsl2经常会遇到网络问题。比如今天在测试一个项目,核心功能是将postgres 的数据使用开源组件synch 同步到clickhouse 这个工作。 测试所需组件 postgres kafka zookeeper redis 阅读全文
posted @ 2021-10-20 23:58 failymao 阅读(2086) 评论(2) 推荐(1) 编辑
摘要: 1. 前言 GMP调度应该是被面试的时候问的频率最高的问题! 我们知道,一切的软件都是跑在操作系统上,真正用来干活 (计算) 的是 CPU。早期的操作系统每个程序就是一个进程,知道一个程序运行完,才能进行下一个进程,就是 “单进程时代” 一切的程序只能串行发生。 1.1 Goroutine 调度器的 阅读全文
posted @ 2021-09-22 08:10 failymao 阅读(624) 评论(0) 推荐(1) 编辑
摘要: 1. 忽略某个字段 格式 // 使用json tag指定json序列化与反序列化时的行为 type Person struct { Name string `json:"name"` // 指定json序列化/反序列化时使用小写name Age int64 Weight float64 `json: 阅读全文
posted @ 2021-09-16 09:51 failymao 阅读(2462) 评论(0) 推荐(1) 编辑
摘要: 1. 对创建的gorouting负责 1.1 不要创建一个你不知道何时退出的 goroutine 下面的代码有什么问题? 是不是在我们的程序种经常写类似的代码? // Week03/blog/01/01.go package main import ( "log" "net/http" _ "net 阅读全文
posted @ 2021-09-14 23:41 failymao 阅读(3526) 评论(4) 推荐(6) 编辑
摘要: 1. 前言 所谓的逃逸分析(Escape analysis)是指由编译器决定内存分配的位置吗不需要程序员指定。 函数中申请一个新的对象 如果分配在栈中, 则函数执行结束后可自动将内存回收 如果分配在堆中, 则函数执行借宿可交给GC(垃圾回收)处理 有了逃逸分析,返回函数局部变量将变得可能,除此之外, 阅读全文
posted @ 2023-03-15 09:11 failymao 阅读(138) 评论(0) 推荐(1) 编辑
摘要: 1. 前言 kafka作为数据中间键在数据服务解耦,大数据,日志方面堪称一把瑞士军刀,备受青睐,作为提供了一套完整命令行的程序,日常进行调试过程中难免会用到一些指令,现总结18条最常用指令。 2. 常用指令 启动消费者 bin/kafka-console-consumer.sh --bootstra 阅读全文
posted @ 2023-03-10 09:24 failymao 阅读(19) 评论(1) 推荐(1) 编辑
摘要: 1. 场景 这两天一直被这个sqlit3困扰,起因是项目中需要有这样一个中间,中间件承担着API角色和流量转发的角色,需要接收来自至少300个agent的请求数据,和健康检测的请求。 所以当即想到用go来实现,因为数据教训,不考虑使用pg大型数据库,所以就选择了轻量化的sqlite数据库。程序很快就 阅读全文
posted @ 2023-03-09 09:37 failymao 阅读(341) 评论(0) 推荐(1) 编辑
摘要: 前言 我们在使用go语言时,最方便莫过于将编译好的二进制文件直接拷贝到服务器中运行即可,但是随着代码工程的复杂可能导致二进制文件很大,这会造成传输过程的时间成本变大,如果在频繁构建,发布中,无疑会增加一些成本,所以有时候考虑将二进制文件编译的越小越好变得算是一件重要的事情, 那么如何将编译的文件最小 阅读全文
posted @ 2023-03-07 18:38 failymao 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 1. 问题 golang构建程序很简单,当遇到需要调用c库时,如通常使用 net,kafka, sqlite3 程序运行时就会调用当前服务器的 动态库,如果遇到没有库时,通常还需要 下载比如 alpine需要安装sqlite apk add --no-cache sqlite-libs sqlite 阅读全文
posted @ 2023-03-07 18:25 failymao 阅读(220) 评论(0) 推荐(0) 编辑
摘要: 1. 前言 Go 语言中两个经常成对出现的两个关键字 — panic 和 recover。这两个关键字与上一节提到的 defer 有紧密的联系,它们都是 Go 语言中的内置函数,也提供了互补的功能。 需要说明两点 panic 能够改变程序的控制流,调用 panic 后会立刻停止执行当前函数的剩余代码 阅读全文
posted @ 2021-12-19 23:06 failymao 阅读(779) 评论(0) 推荐(1) 编辑
摘要: 1. 简介 defer 会在当前函数返回前执行传入的函数,它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。 理解这句话主要在三个方面: 当前函数 返回前执行,当然函数可能没有返回值 传入的函数,即 defer 关键值后面跟的是一个函数,包括普通函数如(fmt.Println), 也可以是匿 阅读全文
posted @ 2021-12-19 22:13 failymao 阅读(329) 评论(0) 推荐(0) 编辑
摘要: 一.序 这一篇算是并发编程的一个补充,起因是当前有个项目,大概の 需求是,根据kafka的分区(partition)数,创建同等数量的 消费者( goroutine)从不同的分区中消费者消费数据,但是总有某种原因导致,某一个分区消费者创建失败,但是其他分区消费者创建失败。 最初的逻辑是,忽略分区失败 阅读全文
posted @ 2021-12-12 00:02 failymao 阅读(564) 评论(1) 推荐(0) 编辑
摘要: 1. 引言 关于闭包的说明,曾在很多篇幅中都有过一些说明,包括Go基础--函数2, go 函数进阶,异常与错误 都有所提到, 但是会发现,好像原理(理论)都懂,但是就是不知道如何使用,或者在看到一些源码时,依然一头雾水。 刚好今天看到了一篇优质的博客,并结合以前几篇关于类似闭包的介绍,再次对 闭包进 阅读全文
posted @ 2021-12-08 00:25 failymao 阅读(406) 评论(2) 推荐(0) 编辑
摘要: 1. 什么是边界检查? 边界检查,英文名 Bounds Check Elimination,简称为 BCE。它是 Go 语言中防止数组、切片越界而导致内存不安全的检查手段。如果检查下标已经越界了,就会产生 Panic。 边界检查使得我们的代码能够安全地运行,但是另一方面,也使得我们的代码运行效率略微 阅读全文
posted @ 2021-12-05 23:12 failymao 阅读(537) 评论(2) 推荐(0) 编辑