小于 1 分钟
目录结构
├── config/ # 配置加载
├── docs/ # Swagger文档
├── logger/ # 日志配置
├── util/ # 工具
├── internal/ # 项目内部代码
│ ├── core/ # 核心初始化
│ ├── ctrls/ # HTTP 路由和请求处理(Gin 的 handlers)
│ ├── service/ # 业务逻辑层
│ ├── repository/ # 数据访问层(数据库/外部API)
│ ├── middleware/ # 中间件(验证、跨域)
│ ├── router/ # HTTP 路由
│ └── model/ # 数据模型(DTO/Entity)
└── main.go # 应用入口
大约 1 分钟
-
Go Web Gin 项目重写Go Web 脚手架 -
10wQPS 抢购系统
-
元信息平台(?还不知道咋搞)
小于 1 分钟
未对齐
给出一个结构体
type User struct {
A int32
B []int32
C string
D bool
E struct{}
}
大约 2 分钟
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
大约 1 分钟
并发问题
主要体现在 runtime.map
的扩容操作中,一个在 扩容
一个在 驱逐
- 解决方案:
- 加锁:但会严重影响
map
的性能 - 使用
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
}
小于 1 分钟
怎么忍得住不用 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}}} |
大约 4 分钟
MongoDB主要是为了应对“三高”需求
- High Performance - 高并发读写需求
- Huge Storage - 对海量数据的高效访问和存储需求
- High Scalability and High Availability - 对数据库的高可扩展、高可用的需求
应用场景
- 社交:用户信息、朋友圈信息、地理位置等
- 游戏:装备、积分等以内嵌文档形式存储,方便查询、高效率存储和访问
- 物流:订单信息、以内嵌数组形式存储可以一次性将订单的所有变化读取出来
- 物联网:设备信息、设备汇报的日志信息等
- 直播:用户信息、点赞互动信息等
小于 1 分钟