𝓜𝓲𝓸𝓶𝓲𝓸𝓻𝓪

吾乃梦之戍人、幻恋之观者、唯于万华镜中、永世长存

个人介绍

欢迎来到妙妙拉的博客😉

👻你好,我叫妙妙拉,24 25 26 岁,🎓学生です!

目前还在上学中🤞,未来想从事的方向为 Golang 开发。

项目


miomiora小于 1 分钟README简介
Go Web 脚手架

目录结构

├── config/          # 配置加载
├── docs/            # Swagger文档
├── logger/          # 日志配置
├── util/            # 工具
├── internal/        # 项目内部代码
│   ├── core/        # 核心初始化
│   ├── ctrls/       # HTTP 路由和请求处理(Gin 的 handlers)
│   ├── service/     # 业务逻辑层
│   ├── repository/  # 数据访问层(数据库/外部API)
│   ├── middleware/  # 中间件(验证、跨域)
│   ├── router/      # HTTP 路由
│   └── model/       # 数据模型(DTO/Entity)
└── main.go          # 应用入口

miomiora大约 1 分钟项目项目mio-init
内存对齐

未对齐

给出一个结构体

type User struct {
	A int32
	B []int32
	C string
	D bool
	E struct{}
}

miomiora大约 2 分钟GoGo内存对齐
nil、空结构体、空接口

nil

nil 数据结构:

// builtin.go
// nil is a predeclared identifier representing the zero value for a
// pointer, channel, func, interface, map, or slice type.
var nil Type // Type must be a pointer, channel, func, interface, map, or slice type

miomiora大约 1 分钟GoGonil空结构体空接口
map

并发问题

主要体现在 runtime.map 的扩容操作中,一个在 扩容 一个在 驱逐

  • 解决方案:
    1. 加锁:但会严重影响 map 的性能
    2. 使用 sync.Map 使用了两个 map 分离了扩容的问题,数据结构如下
type Map struct {
    // 锁,主要是锁 dirty map
	mu Mutex
	
	// 不会触发扩容操作(查、改)走这个 read map
	read atomic.Pointer[readOnly]
	
	// 可能引发扩容操作(增)走 dirty map
	dirty map[any]*entry
	
	// 未命中 read map 的计数,如果超过了 len(dirty map) 则会把 dirty map 提升为 read map
	misses int
}

type readOnly struct {
    // read map 本体
	m       map[any]*entry
	
	// 是否有追加操作,如果为 true 则代表 dirty map 中包含 m 没有的 key
	// 当 read map 未命中的时候会去 dirty map 查找新值
	amended bool
}

miomiora小于 1 分钟GoGomap
Go 实现 CRUD 操作

怎么忍得住不用 Go 来试试的,选用的包为 github.com/mongodb/mongo-go-driver

预备

在正式开始之前,有一个东西在这个包中是必须得了解的,那就是 bson 以下是官方注释

类型 说明 示例
bson.D BSON文档的有序表示,在需要顺序的场合比较重要,也就是 MongoDB 的命令 bson.D{{"foo", "bar"}, {"hello","world"}, {"pi", 3.14159}}
bson.E 主要作为bson.D的一个元素,通常在一个D中跟使用 bson.E{"foo", "bar"}
bson.M BSON文档的无序表示map[string]interface{} bson.M{"foo": "bar", "hello": "world", "pi": 3.14159}
bson.A BSON文档数组的有序表示 bson.A{"bar", "world", 3.14159, bson.D{{"qux", 12345}}}

miomiora大约 4 分钟MongoDBGoMongoDB数据库
为什么选择 MongoDB

MongoDB主要是为了应对“三高”需求

  • High Performance - 高并发读写需求
  • Huge Storage - 对海量数据的高效访问和存储需求
  • High Scalability and High Availability - 对数据库的高可扩展、高可用的需求

应用场景

  • 社交:用户信息、朋友圈信息、地理位置等
  • 游戏:装备、积分等以内嵌文档形式存储,方便查询、高效率存储和访问
  • 物流:订单信息、以内嵌数组形式存储可以一次性将订单的所有变化读取出来
  • 物联网:设备信息、设备汇报的日志信息等
  • 直播:用户信息、点赞互动信息等

miomiora小于 1 分钟MongoDBMongoDB数据库
2
3
4