置顶文章
精选分类
Linux
design-pattern
golang
leetcode
文章列表
golang-内存模型与分配
原文地址
# Golang 内存模型
堆是 Go 运行时中最大的临界共性资源,这意味着每次存取都要加锁,在性能层面是很恐怖的事情。为解决这个问题,Golang 在堆 mheap 之上,一次细化粒度,建立了 mcentral、mcache 的模型
mheap: 全局内存起源,访问要加全局锁
mcentral: 每种对象大小规格(全局共花纹为 68 种)对应的缓存,锁的粒度也仅限于同一种规格以内
mcache: 每个 P(即 GMP 中的 P)持有一份的内存缓存,访问时无锁
# 核心概念
# 内存单元 mspan
mspan 是一个双向链表结构。
mspan 是 golang...
more...
golang-内置工具
# go build
go build -n
显示编译过程中所有执行的命令,不会真正执行。
go build -race
用来检查代码中是否存在竞态问题
go build -gcflags
-N 禁止优化
-l 禁止内联
-S 打印出汇编代码
-m 打印出变量逃逸信息
-m -m 打印出更丰富的变量逃逸信息
# go tool compile
more...
golang-sync.Once
# 数据结构
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())...
more...
golang-cgo
# 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 在编译...
more...
golang-单机锁实现原理
# 单机锁实现原理
两种模式的转换条件:
默认为正常模式
正常模式 -> 饥饿模式:
饥饿模式 -> 正常模式:
# Sync.Mutex
# 数据结构 与 状态位
type Mutex struct { state int32 sema uint32}
state: 锁中最核心的状态字段,不同 bit 位分别存储了 mutexLocked (是否上锁)、mutexWoken (是否有等待的 goroutine 被唤醒)、mutexStarving (是否处于饥饿模式) 等信息。
sema: 用于阻塞和唤醒 goroutine...
more...
PostgreSQL入门
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...
more...
reflect反射
# Go 反射完整指南
Go 中的反射库 reflect 提供了在运行时检查类型和值的能力。它允许程序在运行时获取变量的类型信息,并动态地调用方法或访问字段。
Go 中的反射是建立在类型系统之上的,它与空接口 interface{} 密切相关。反射库 reflect 提供了 Type 和 Value 两个核心类型,分别表示 Go 中的类型和值。
# 为什么需要反射
在以下场景中,反射非常有用:
编写通用代码:如 JSON 序列化 / 反序列化库,需要处理任意类型
ORM 框架:需要将结构体字段映射到数据库列
依赖注入:动态创建和注入对象
框架和库开发:如...
more...
空结构体struct{}的使用
# Go 语言空结构体 (struct {}) 详解
# 1. 什么是空结构体
空结构体 struct{} 是 Go 语言中一个特殊的类型:
没有任何字段
不占用任何内存空间(大小为 0 字节)
所有的空结构体实例指向同一个地址
fmt.Println(unsafe.Sizeof(struct{}{})) // 输出: 0# 2. 主要应用场景
# 2.1 信号通道
用于仅需传递信号而不需要传递数据的场景:
// 声明一个信号通道done := make(chan...
more...







