9.1k 8 分钟

# go 逃逸分析 先看代码 package mainfunc foo(arg_val int)(*int) { var foo_val int = 11; return &foo_val;}func main() { main_val := foo(666) println(*main_val)}编译运行 $ go run pro_1.go 11没有报错。正常 C/C++ 都会报错,因为外部函数使用了子函数的局部变量,局部变量超过生命周期就会被销毁。 # Golang 编译器得逃逸分析 go...
2.9k 3 分钟

# go gc GoV1.3- 普通标记清除法,整体过程需要启动 STW,效率极低。 GoV1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈 (需要 STW),效率普通 GoV1.8 - 三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要 STW,效率较高。 # 标记清除 第一步,暂停程序业务逻辑,分类出可达和不可达的对象,然后做上标记。 第二步,开始标记,程序找出它所有可达的对象,并做上标记。 第三步,标记完了之后,然后开始清除未标记的对象。 第四步,停止暂停,让程序继续跑。然后循环重复这个过程,直到 process...
8.1k 7 分钟

# goroutine 调度器 https://learnku.com/articles/41728 # 背景 一个线程分为 “内核态 “线程和” 用户态 “线程 一个 “用户态线程” 必须要绑定一个 “内核态线程”,但是 CPU 并不知道有 “用户态线程” 的存在,它只知道它运行的是一个 “内核态线程”(Linux 的 PCB 进程控制块)。 内核线程依然叫 “线程 (thread)”,用户线程叫 “协程 (co-routine)”. 既然一个协程 (co-routine) 可以绑定一个线程 (thread),那么能不能多个协程 (co-routine) 绑定一个或者多个线程...
2.9k 3 分钟

# go 协程实现快排 突发奇想想要用协程优化快排,毕竟他就是分块操作的 // V1.gopackage quicksorttype v1 struct{}func QuickSortV1(list []int) []int { if len(list) <= 1 { return list } v1{}.quicksort(list, 0, len(list)-1) return list}func (v v1)...
12k 11 分钟

# Zero Allocation JSON Logger Zerolog https://github.com/rs/zerolog Zerolog 包提供了一个专用于 JSON 输出的快速且简单的 Logger 记录器。 Zerolog 的 API 旨在提供出色的开发人员体验和令人惊叹的性能。其独特的链接 API 允许 Zerolog 通过避免分配和反射来写入 JSON(或 CBOR)日志事件。 Uber 的 zap 库率先采用了这种方法。 Zerolog 通过更简单的 API 和更好的性能将这一概念提升到了一个新的水平。 为了保持代码库和 API 简单,zerolog...
21k 19 分钟

# 测试 测试驱动开发(Test-Driven Development,...
6.9k 6 分钟

# 包 # 基本信息 包(package)由同一目录下的多个源文件构成。 含 .go 、 .c 、 .s 等文件。 在 .go 头部通过 package 定义所属包。 源文件必须是 UTF-8 格式。 包是成员作用域边界,包内成员可相互访问。 名称首字母大写为 导出成员(exported),可外部访问。 包名可与目录名不同,通常小写单数模式。同一目录下源文件必须使用相同包名。 package mylib // 包名通常与目录一致。func ddd(x, y int) int { // 私有成员。 return x + y}func Hello()...
20k 18 分钟

# 并发 并发编程相关概念。 并发(concurrency):逻辑上具备同时处理多个任务的能力。 并行(parallesim):物理上在同一时刻执行多个并发任务。 需要程序以并发模型设计。执行时依据环境(单核或多核处理器)不同,有不同运行方式和效率。多核处理器真正同时执行多个任务,而单核只能以间隔切换方式运行。所以说,并发是并行的必要条件,并行是并发的理想状态。并行需要多进程(process)或多线程(thread)支持,而并发可在单线程上以协程(coroutine)实现。 协程通常是指在单线程上,通过协作式切换执行多个任务的并发设计。比如,将 IO...
7.7k 7 分钟

# 范式 泛型(generic)是一种代码复用技术,有时也称作模板(template)。允许在强类型语言代码中,使用实例化时才指定的 类型参数(type parameter)。 函数和类型(含接口)支持类型参数,方法暂不支持。 支持推导,可省略类型实参(type argument)。 通常以单个大写字母命名类型参数。 类型参数必须有约束(constraints)。 package mainimport ( "cmp")func maxValue[T cmp.Ordered](x, y T) T { if x > y { return...
-->