置顶文章

精选分类

文章列表

原文地址 # Golang 内存模型 堆是 Go 运行时中最大的临界共性资源,这意味着每次存取都要加锁,在性能层面是很恐怖的事情。为解决这个问题,Golang 在堆 mheap 之上,一次细化粒度,建立了 mcentral、mcache 的模型 mheap: 全局内存起源,访问要加全局锁 mcentral: 每种对象大小规格(全局共花纹为 68 种)对应的缓存,锁的粒度也仅限于同一种规格以内 mcache: 每个 P(即 GMP 中的 P)持有一份的内存缓存,访问时无锁 # 核心概念 # 内存单元 mspan mspan 是一个双向链表结构。 mspan 是 golang...

# go build go build -n 显示编译过程中所有执行的命令,不会真正执行。 go build -race 用来检查代码中是否存在竞态问题 go build -gcflags -N 禁止优化 -l 禁止内联 -S 打印出汇编代码 -m 打印出变量逃逸信息 -m -m 打印出更丰富的变量逃逸信息 # go tool compile

# 数据结构 type Once struct { done atomic.Uint32 // 0 = unused, 1 = used,用于标志操作是否操作 m Mutex // 锁,用来第一操作时候,加锁处理}# 源码 func (o *Once) Do(f func()) { // 快路径:无锁判断 // 若已为 1,直接返回,避免加锁开销 if o.done.Load() == 0 { o.doSlow(f) }}func (o *Once) doSlow(f func())...

# cgo # cgo 是什么 cgo 是 Go 语言的一个特性,它允许 Go 代码调用 C 代码。cgo 可以让 Go 程序使用 C 语言编写的库,也可以让 Go 程序调用 C 语言编写的程序。 # cgo 语法 cgo 的语法比较简单,只需要在 Go 代码中包含一个特殊的注释即可。例如: /*#cgo CFLAGS: -I/path/to/c/include#cgo LDFLAGS: -L/path/to/c/library -lmylib#include <myheader.h>*/import "C"// Go 代码上面的注释告诉 cgo 在编译...

# 单机锁实现原理 两种模式的转换条件: 默认为正常模式 正常模式 -> 饥饿模式: 饥饿模式 -> 正常模式: # Sync.Mutex # 数据结构 与 状态位 type Mutex struct { state int32 sema uint32} state: 锁中最核心的状态字段,不同 bit 位分别存储了 mutexLocked (是否上锁)、mutexWoken (是否有等待的 goroutine 被唤醒)、mutexStarving (是否处于饥饿模式) 等信息。 sema: 用于阻塞和唤醒 goroutine...

linux 切换到 postgres 用户来开启命令行: sudo -i -u postgrespsql \l 查看所有数据库 \c + 数据库名 切换数据库 drop database mydb; 删除数据库 \d \d zh psql -h localhost -p 5432 -U zh zh 连接数据库 # 常见数据类型 # 数值类型 类型 存储空间 描述 范围 smallint 2 字节 小整数 -32768 到 +32767 integer 4 字节 整数 -2147483648 到 +2147483647 bigint 8...

# Go 反射完整指南 Go 中的反射库 reflect 提供了在运行时检查类型和值的能力。它允许程序在运行时获取变量的类型信息,并动态地调用方法或访问字段。 Go 中的反射是建立在类型系统之上的,它与空接口 interface{} 密切相关。反射库 reflect 提供了 Type 和 Value 两个核心类型,分别表示 Go 中的类型和值。 # 为什么需要反射 在以下场景中,反射非常有用: 编写通用代码:如 JSON 序列化 / 反序列化库,需要处理任意类型 ORM 框架:需要将结构体字段映射到数据库列 依赖注入:动态创建和注入对象 框架和库开发:如...

# Go 语言空结构体 (struct {}) 详解 # 1. 什么是空结构体 空结构体 struct{} 是 Go 语言中一个特殊的类型: 没有任何字段 不占用任何内存空间(大小为 0 字节) 所有的空结构体实例指向同一个地址 fmt.Println(unsafe.Sizeof(struct{}{})) // 输出: 0# 2. 主要应用场景 # 2.1 信号通道 用于仅需传递信号而不需要传递数据的场景: // 声明一个信号通道done := make(chan...