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...
7.5k 7 分钟

# 接口 接口(interface)是多个方法声明集合,代表一种调用契约。 只要目标类型方法集包含接口声明的全部方法,就视为实现该接口,无需显示声明。当然,单个目标类型可实现多个接口。在设计上,接口解除了显式类型依赖(DIP,依赖倒置),提供面向对象多态性。应该定义小型、灵活及组合性接口(ISP,接口隔离),减少可视方法,屏蔽对象内部结构和实现细节。 不能有字段。 只能声明方法,不能实现。 可嵌入其他接口。 通常以 er 作为名称后缀。 空接口( interface{} , any )没有任何方法声明。 接口实现的依据是方法集,所以要区分 T.set 和...
7.8k 7 分钟

# 方法 方法( method )是与对象实例( instance )相绑定的特殊函数。 方法是面向对象编程的基本概念,用于维护和展示对象自身状态。对象是内敛的,每个实例都有各自不同的独立特征,以属性和方法来对外暴露。普通函数专注于算法流程,接收参数完成逻辑运算,返回结果并清理现场。也就是说,方法有持续性状态,而函数通常没有。 前置接收参数( receiver ),代表方法所属类型。 可为当前包内除接口和指针以外的任何类型定义方法。 不支持静态方法( static method )或关联函数。 不支持重载( overload )。 func (int) test()...
33k 30 分钟

# 数据 内置数据类型,使用及结构分析。 # 字符串 字符串是 不可变 字节序列,其本身是一个复合结构。 +-----------+ +---+---+---+---+---+ | pointer -|--------> | h | e | l | l | o | +-----------+ +---+---+---+---+---+ | len = 5 | +-----------+ [...]byte, UTF-8 header// runtime/string.gotype stringStruct struct { str unsafe.Pointer len...
14k 13 分钟

# 函数 # 基本概念 函数(function)是结构化编程的最小模块单元。 将复杂算法过程分解成若干较小任务,隐藏细节,使得程序结构更加清晰,易于维护。函数被设计成相对独立,通过接收输入参数完成一段算法指令,输出或存储相关结果。因此,函数还是代码复用和测试的基本单元。 关键字 func 用于定义函数。有些不方便的限制,但也借鉴了动态语言的优点。 无需前置声明。 支持不定长变参。 支持多返回值。 支持命名返回值。 支持匿名函数和闭包。 不支持命名嵌套定义(nested)。 不支持同名函数重载(overload)。 不支持默认参数。 函数是第一类对象。 只能判断是否为...
-->