pkg/

directory
v0.0.0-...-2eab0c0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 17, 2026 License: Apache-2.0

Directories

Path Synopsis
Package afterwork 提供请求级后台任务延寿(waitUntil 语义)。
Package afterwork 提供请求级后台任务延寿(waitUntil 语义)。
Package audit 提供操作审计日志:结构化记录"谁在何时对什么资源做了什么操作", 仅记录成功的请求(失败请求走普通日志),用于合规与运维审计。
Package audit 提供操作审计日志:结构化记录"谁在何时对什么资源做了什么操作", 仅记录成功的请求(失败请求走普通日志),用于合规与运维审计。
Package backoff 提供指数退避 + 抖动(jitter)的重试原语,纯标准库。
Package backoff 提供指数退避 + 抖动(jitter)的重试原语,纯标准库。
Package bitmap 提供位图:用 1 bit 表示一个布尔状态,极省内存的大规模标记与集合运算。
Package bitmap 提供位图:用 1 bit 表示一个布尔状态,极省内存的大规模标记与集合运算。
Package callbacks 提供非侵入的执行切面:在某个执行单元的开始/结束/出错时机 触发回调,用于统一注入可观测性(trace、metrics、日志)而不改动业务代码。
Package callbacks 提供非侵入的执行切面:在某个执行单元的开始/结束/出错时机 触发回调,用于统一注入可观测性(trace、metrics、日志)而不改动业务代码。
Package chanx 提供无界 channel 等 channel 扩展原语。
Package chanx 提供无界 channel 等 channel 扩展原语。
client
grpcclient/resolver/consul
Package consul registers a Consul-backed gRPC name resolver.
Package consul registers a Consul-backed gRPC name resolver.
grpcclient/resolver/etcd
Package etcd registers an etcd-backed gRPC name resolver.
Package etcd registers an etcd-backed gRPC name resolver.
grpcclient/resolver/k8s
Package k8s registers a Kubernetes-backed gRPC name resolver.
Package k8s registers a Kubernetes-backed gRPC name resolver.
grpcclient/resolver/nacos
Package nacos registers a Nacos-backed gRPC name resolver.
Package nacos registers a Nacos-backed gRPC name resolver.
grpcclient/resolver/polaris
Package polaris registers a Polaris-backed gRPC name resolver.
Package polaris registers a Polaris-backed gRPC name resolver.
grpcclient/xds
Package xds 启用客户端 xDS 支持。
Package xds 启用客户端 xDS 支持。
Package cooldown 提供按 key 的冷却(CD)原语:某个动作触发后,要等到冷却结束 才能再次触发。
Package cooldown 提供按 key 的冷却(CD)原语:某个动作触发后,要等到冷却结束 才能再次触发。
Package counter 提供按 key 的滑动窗口计数与时间窗配额,纯内存实现。
Package counter 提供按 key 的滑动窗口计数与时间窗配额,纯内存实现。
Package ctxkey 提供类型安全的 context.Context 键。
Package ctxkey 提供类型安全的 context.Context 键。
Package dag 提供一个轻量的有向无环图(DAG)执行器: 按依赖关系将节点拓扑分层,同一层内的节点并行执行,层间串行。
Package dag 提供一个轻量的有向无环图(DAG)执行器: 按依赖关系将节点拓扑分层,同一层内的节点并行执行,层间串行。
Package dberr 把数据库驱动错误翻译为 pkg/errors 的 *Status, 让仓储层只抛原生 driver error,中间件/网关层统一拿到带业务码的错误。
Package dberr 把数据库驱动错误翻译为 pkg/errors 的 *Status, 让仓储层只抛原生 driver error,中间件/网关层统一拿到带业务码的错误。
Package delayqueue 提供定点单次触发的延迟任务原语:注册一个未来时刻要执行的 回调,到点由后台 goroutine 触发;支持按 key 取消 / 改期。
Package delayqueue 提供定点单次触发的延迟任务原语:注册一个未来时刻要执行的 回调,到点由后台 goroutine 触发;支持按 key 取消 / 改期。
Package dlock 定义跨进程分布式锁与选主(leader election)的后端无关接口。
Package dlock 定义跨进程分布式锁与选主(leader election)的后端无关接口。
domain
chat
Package chat 提供频道聊天消息:按 channel 持久化 + 自增 message_id 游标分页。
Package chat 提供频道聊天消息:按 channel 持久化 + 自增 message_id 游标分页。
group
Package group 提供群组实体:成员角色、邀请/申请审核、公告、最大人数、封禁名单。
Package group 提供群组实体:成员角色、邀请/申请审核、公告、最大人数、封禁名单。
inbox
Package inbox 提供点对点离线消息收件箱:已读/未读、游标分页、ACK。
Package inbox 提供点对点离线消息收件箱:已读/未读、游标分页、ACK。
notification
Package notification 提供离线通知队列:用户不在线时存通知,上线后拉取, 与 pkg/router 的实时路由互补——router 投在线者,notification 投离线者。
Package notification 提供离线通知队列:用户不在线时存通知,上线后拉取, 与 pkg/router 的实时路由互补——router 投在线者,notification 投离线者。
party
Package party 提供无权威的多人小团体原语:Leader + Members + 加入请求队列, 成员变更时广播给全员。
Package party 提供无权威的多人小团体原语:Leader + Members + 加入请求队列, 成员变更时广播给全员。
relationship
Package relationship 提供社交图谱原语:用二部有向图刻画"谁对谁是什么关系", 支持好友(双向)、关注(单向)、拉黑(单向隔离)、群组成员(带角色)等多种语义, 通过状态编码 + position 游标实现高效查询与分页。
Package relationship 提供社交图谱原语:用二部有向图刻画"谁对谁是什么关系", 支持好友(双向)、关注(单向)、拉黑(单向隔离)、群组成员(带角色)等多种语义, 通过状态编码 + position 游标实现高效查询与分页。
storage
Package storage 提供版本化的对象存储原语:owner + collection + key + value + version, 通过乐观并发控制(OCC)保证并发写不覆盖,支持三种写语义与懒淘汰索引。
Package storage 提供版本化的对象存储原语:owner + collection + key + value + version, 通过乐观并发控制(OCC)保证并发写不覆盖,支持三种写语义与懒淘汰索引。
tournament
Package tournament 提供锦标赛(时间窗排行榜):在 pkg/leaderboard 之上 增加"按 cron 表达式周期性重置"的能力,每周期一个独立榜单,到期自动滚动到下一周期。
Package tournament 提供锦标赛(时间窗排行榜):在 pkg/leaderboard 之上 增加"按 cron 表达式周期性重置"的能力,每周期一个独立榜单,到期自动滚动到下一周期。
wallet
Package wallet 提供虚拟货币/积分/库存的账本式钱包: 采用"不可变事务日志(append-only ledger) + 当前余额派生"双模型, 通过 changeset 差值更新原子校验,避免超扣/超发。
Package wallet 提供虚拟货币/积分/库存的账本式钱包: 采用"不可变事务日志(append-only ledger) + 当前余额派生"双模型, 通过 changeset 差值更新原子校验,避免超扣/超发。
Package ephemeral 提供短期 TTL KV:不版本化、不持久,纯内存 + 到点自动过期。
Package ephemeral 提供短期 TTL KV:不版本化、不持久,纯内存 + 到点自动过期。
Package eventbus 提供进程内、按主题(topic)分发的泛型事件总线:发布者按 topic 发事件,订阅者按 topic 注册回调处理函数,解耦"谁发"与"谁收"。
Package eventbus 提供进程内、按主题(topic)分发的泛型事件总线:发布者按 topic 发事件,订阅者按 topic 注册回调处理函数,解耦"谁发"与"谁收"。
Package featureflag 提供本地评估的特性开关与 A/B 实验: 布尔开关、百分比灰度、按属性定向、多变体实验,均基于确定性哈希分桶, 同一标识(如 userID)多次评估结果稳定,无需远程调用。
Package featureflag 提供本地评估的特性开关与 A/B 实验: 布尔开关、百分比灰度、按属性定向、多变体实验,均基于确定性哈希分桶, 同一标识(如 userID)多次评估结果稳定,无需远程调用。
Package fsm 提供泛型有限状态机原语:声明式定义"状态 + 事件 → 目标状态"的 合法转移表,运行时 Fire(event) 只允许沿合法转移推进,非法转移报错而非静默改状态。
Package fsm 提供泛型有限状态机原语:声明式定义"状态 + 事件 → 目标状态"的 合法转移表,运行时 Fire(event) 只允许沿合法转移推进,非法转移报错而非静默改状态。
Package gameloop 是一个「机制而非策略」的定步长游戏循环原语,用于在 beauty 上 搭帧同步(lockstep)/状态同步的服务端骨架。
Package gameloop 是一个「机制而非策略」的定步长游戏循环原语,用于在 beauty 上 搭帧同步(lockstep)/状态同步的服务端骨架。
Package generic 提供一组类型安全的泛型/反射小工具。
Package generic 提供一组类型安全的泛型/反射小工具。
Package geohash 提供经纬度的 Geohash 编码/解码、邻居计算与覆盖查询,纯标准库。
Package geohash 提供经纬度的 Geohash 编码/解码、邻居计算与覆盖查询,纯标准库。
governance
bannednodes
Package bannednodes 提供单次请求内的节点禁用机制。
Package bannednodes 提供单次请求内的节点禁用机制。
circuitbreaker
Package circuitbreaker 提供节点级熔断器。
Package circuitbreaker 提供节点级熔断器。
overloadctrl
Package overloadctrl 提供反馈驱动的自适应限流。
Package overloadctrl 提供反馈驱动的自适应限流。
router
Package router 提供服务发现与负载均衡之间的路由过滤层。
Package router 提供服务发现与负载均衡之间的路由过滤层。
Package handler 提供声明式 HTTP handler 包装器:把 auth 策略 + 资源注入 + 错误归一化从业务 handler 上移到包装器,handler 只关心 (ctx, req) => (resp, error)。
Package handler 提供声明式 HTTP handler 包装器:把 auth 策略 + 资源注入 + 错误归一化从业务 handler 上移到包装器,handler 只关心 (ctx, req) => (resp, error)。
Package hls 提供一个直播/点播 HLS origin:管理滚动分片窗口、生成 m3u8 播放列表, 并作为 http.Handler 挂在任意 mux(如 pkg/service/webserver)上分发。
Package hls 提供一个直播/点播 HLS origin:管理滚动分片窗口、生成 m3u8 播放列表, 并作为 http.Handler 挂在任意 mux(如 pkg/service/webserver)上分发。
Package idempotency 提供幂等执行原语:同一 key 的重复请求只执行一次, 后续请求(含并发)复用首次结果,直到该 key 过期。
Package idempotency 提供幂等执行原语:同一 key 的重复请求只执行一次, 后续请求(含并发)复用首次结果,直到该 key 过期。
Package idgen 提供分布式唯一 ID 生成器(Snowflake 算法),纯标准库实现。
Package idgen 提供分布式唯一 ID 生成器(Snowflake 算法),纯标准库实现。
infra
k8s
Package k8s 提供基于 Kubernetes 原生选主能力实现 pkg/dlock.Elector 的后端, 使 Cron 等"多实例只该有一个在跑"的场景可以直接用集群内已有的 k8s API, 不必额外运维一套 etcd/Redis。
Package k8s 提供基于 Kubernetes 原生选主能力实现 pkg/dlock.Elector 的后端, 使 Cron 等"多实例只该有一个在跑"的场景可以直接用集群内已有的 k8s API, 不必额外运维一套 etcd/Redis。
redis
Package redis 提供基于 Redis 的基建适配:分布式锁/选主(实现 pkg/dlock)与 带 TTL 的原子 KV 存储(实现 pkg/kvstore.Store,给 counter/cooldown/idempotency 等原语一个真实的跨实例后端)。
Package redis 提供基于 Redis 的基建适配:分布式锁/选主(实现 pkg/dlock)与 带 TTL 的原子 KV 存储(实现 pkg/kvstore.Store,给 counter/cooldown/idempotency 等原语一个真实的跨实例后端)。
Package keyedmutex 提供按 key 的细粒度锁:同一 key 的持有者互斥(串行), 不同 key 之间互不阻塞(并行)。
Package keyedmutex 提供按 key 的细粒度锁:同一 key 的持有者互斥(串行), 不同 key 之间互不阻塞(并行)。
Package kvstore 定义一个带 TTL 的原子键值存储接口,供需要"跨进程共享状态"的 原语(counter / cooldown / idempotency)接入分布式后端(如 Redis)。
Package kvstore 定义一个带 TTL 的原子键值存储接口,供需要"跨进程共享状态"的 原语(counter / cooldown / idempotency)接入分布式后端(如 Redis)。
Package leaderboard 提供排行榜的内存排名缓存:用堆排序维护每个榜的有序结构, O(log N) 查"我的名次"、按名次取记录,避免高频读时每次 ORDER BY 击穿数据库。
Package leaderboard 提供排行榜的内存排名缓存:用堆排序维护每个榜的有序结构, O(log N) 查"我的名次"、按名次取记录,避免高频读时每次 ORDER BY 击穿数据库。
Package leveling 提供经验值 / 等级曲线原语:给定当前经验加一笔增量,算出新等级、 是否升级、跨了几级、当前等级内进度。
Package leveling 提供经验值 / 等级曲线原语:给定当前经验加一笔增量,算出新等级、 是否升级、跨了几级、当前等级内进度。
Package loadbalance 提供通用的负载均衡算法原语,不绑定任何 RPC/服务发现框架。
Package loadbalance 提供通用的负载均衡算法原语,不绑定任何 RPC/服务发现框架。
Package loot 提供加权随机抽取原语:抽卡 / 开宝箱 / 怪物掉落 / 直播抽奖。
Package loot 提供加权随机抽取原语:抽卡 / 开宝箱 / 怪物掉落 / 直播抽奖。
Package match 提供有状态实时会话原语,采用 actor 模型: 每个会话(房间/对战/协作编辑)由独立 goroutine 驱动,固定帧率 tick, 所有输入(业务数据、成员变更、同步信号)经带缓冲 channel 串行消费, 状态封装在 goroutine 内,无需锁。
Package match 提供有状态实时会话原语,采用 actor 模型: 每个会话(房间/对战/协作编辑)由独立 goroutine 驱动,固定帧率 tick, 所有输入(业务数据、成员变更、同步信号)经带缓冲 channel 串行消费, 状态封装在 goroutine 内,无需锁。
Package matchmaker 提供基于属性匹配的组队原语。
Package matchmaker 提供基于属性匹配的组队原语。
Package media 提供直播/视频服务的编排薄机制:多路流管理(Hub)、子进程监督 (Supervisor,如 ffmpeg 转码进程,含崩溃重启)与 OTel 运维指标。
Package media 提供直播/视频服务的编排薄机制:多路流管理(Hub)、子进程监督 (Supervisor,如 ffmpeg 转码进程,含崩溃重启)与 OTel 运维指标。
remux
Package remux 把 RTMP 收到的 FLV(H.264 + AAC)重封装成 MPEG-TS 分片,按关键帧切片 后 Append 到 pkg/hls.Stream——从而把 pkg/media/rtmp(采集)和 pkg/hls(分发)串成 一条端到端直播链路。
Package remux 把 RTMP 收到的 FLV(H.264 + AAC)重封装成 MPEG-TS 分片,按关键帧切片 后 Append 到 pkg/hls.Stream——从而把 pkg/media/rtmp(采集)和 pkg/hls(分发)串成 一条端到端直播链路。
rtmp
Package rtmp 提供一个 RTMP 采集(ingest)服务端,薄封装 github.com/yutopp/go-rtmp。
Package rtmp 提供一个 RTMP 采集(ingest)服务端,薄封装 github.com/yutopp/go-rtmp。
Package metadata 提供服务间调用的透传元数据机制。
Package metadata 提供服务间调用的透传元数据机制。
propagation
Package propagation 提供 MD 在 HTTP / gRPC 传输层的注入与提取实现。
Package propagation 提供 MD 在 HTTP / gRPC 传输层的注入与提取实现。
middleware
callbacks
Package callbacks 把 pkg/callbacks 的切面接入 beauty 的 HTTP / gRPC 服务: 在每个请求前后触发已注册的 callbacks.Handler(全局或随 ctx 局部), 用于统一注入 trace / metrics / 日志,而无需改动业务 handler。
Package callbacks 把 pkg/callbacks 的切面接入 beauty 的 HTTP / gRPC 服务: 在每个请求前后触发已注册的 callbacks.Handler(全局或随 ctx 局部), 用于统一注入 trace / metrics / 日志,而无需改动业务 handler。
Package momentum 提供"连击 + 热度时间衰减"原语:按 key 追踪连续触发的连击数, 并维护一个随时间指数衰减的热度值。
Package momentum 提供"连击 + 热度时间衰减"原语:按 key 追踪连续触发的连击数, 并维护一个随时间指数衰减的热度值。
Package options 提供分层的功能选项(functional options)模式: 框架定义一组“通用选项”,各实现方再追加自己的“专属选项”,调用方把两类选项 混在同一个 []Option 里传入;框架与实现各自用类型安全的方式提取属于自己的部分。
Package options 提供分层的功能选项(functional options)模式: 框架定义一组“通用选项”,各实现方再追加自己的“专属选项”,调用方把两类选项 混在同一个 []Option 里传入;框架与实现各自用类型安全的方式提取属于自己的部分。
Package pathfind 提供网格地图上的 A* 寻路,纯计算、纯标准库、零依赖。
Package pathfind 提供网格地图上的 A* 寻路,纯计算、纯标准库、零依赖。
Package presence 提供在线状态(在场追踪)原语:维护"谁在哪个流(stream)里" 的双向索引,支持 O(1) 按流查询成员、按会话查询所在流,以及 join/leave 事件总线。
Package presence 提供在线状态(在场追踪)原语:维护"谁在哪个流(stream)里" 的双向索引,支持 O(1) 按流查询成员、按会话查询所在流,以及 join/leave 事件总线。
status
Package status 把用户的在线状态变化(上线/下线/进出流)推送给关注他的人。
Package status 把用户的在线状态变化(上线/下线/进出流)推送给关注他的人。
Package questlog 提供任务 / 成就的进度追踪:定义一组带目标值的任务,累加进度, 达标后可领取(一次),支持前置依赖与周期重置。
Package questlog 提供任务 / 成就的进度追踪:定义一组带目标值的任务,累加进度, 达标后可领取(一次),支持前置依赖与周期重置。
Package quic 提供基于 QUIC(quic-go)的连接层,作为 pkg/ws(WebSocket/TCP)之外 面向实时/游戏同步的可选传输。
Package quic 提供基于 QUIC(quic-go)的连接层,作为 pkg/ws(WebSocket/TCP)之外 面向实时/游戏同步的可选传输。
Package ratelimit 提供基于键的限流原语:令牌桶 + 滑动窗口两种实现, 外加 HTTP 中间件,可与 pkg/handler 组合(声明式 WithRatelimit)。
Package ratelimit 提供基于键的限流原语:令牌桶 + 滑动窗口两种实现, 外加 HTTP 中间件,可与 pkg/handler 组合(声明式 WithRatelimit)。
Package reddot 提供小红点 / 未读聚合树:把散落各处的未读数按树形层级聚合, 父节点的未读 = 所有子节点未读之和,叶子清零自动向上传播。
Package reddot 提供小红点 / 未读聚合树:把散落各处的未读数按树形层级聚合, 父节点的未读 = 所有子节点未读之和,叶子清零自动向上传播。
Package resume 提供断线重连的在场状态还原:客户端用 refresh token 重连, 服务端换出 userID,查 presence 看用户还在哪些流,返回流列表让客户端自动重连。
Package resume 提供断线重连的在场状态还原:客户端用 refresh token 重连, 服务端换出 userID,查 presence 看用户还在哪些流,返回流列表让客户端自动重连。
Package ringbuffer 提供定长环形缓冲:只保留最近 N 条,写满后覆盖最旧的, O(1) 追加。
Package ringbuffer 提供定长环形缓冲:只保留最近 N 条,写满后覆盖最旧的, O(1) 追加。
Package router 提供多语义消息路由:把一条消息发给一组人(presence IDs)、 一个流(stream)的全部成员、或所有人,并支持一帧内多条消息攒批下发。
Package router 提供多语义消息路由:把一条消息发给一组人(presence IDs)、 一个流(stream)的全部成员、或所有人,并支持一帧内多条消息攒批下发。
Package safe 提供 panic 恢复相关的小工具:把 panic 转成带堆栈的 error, 以及安全启动 goroutine(panic 不会崩进程)。
Package safe 提供 panic 恢复相关的小工具:把 panic 转成带堆栈的 error, 以及安全启动 goroutine(panic 不会崩进程)。
Package saga 提供跨服务 Saga 编排:按顺序执行一组"正向操作",任一步失败时 逆序执行已成功步骤的"补偿操作",达成最终一致。
Package saga 提供跨服务 Saga 编排:按顺序执行一组"正向操作",任一步失败时 逆序执行已成功步骤的"补偿操作",达成最终一致。
Package scheduler 提供工作池式任务调度器:生产者把任务投递到队列, N 个 worker goroutine 并发消费;支持运行时 Pause/Resume 与优雅停止。
Package scheduler 提供工作池式任务调度器:生产者把任务投递到队列, N 个 worker goroutine 并发消费;支持运行时 Pause/Resume 与优雅停止。
service
Package spatial 提供网格空间索引:把实体按坐标分桶到固定大小的网格单元, 支持"范围查询"(附近的人/实体)与 KNN(最近的 N 个),避免全量遍历。
Package spatial 提供网格空间索引:把实体按坐标分桶到固定大小的网格单元, 支持"范围查询"(附近的人/实体)与 KNN(最近的 N 个),避免全量遍历。
Package sse 提供 Server-Sent Events 的轻量封装,屏蔽 SSE 在 Go 里的常见坑: 自动设置流式响应头、解除本连接的写超时(避免被 server WriteTimeout 掐断)、 每条事件后自动 flush(穿透 otelhttp / compress 等包装链)、客户端断开时结束。
Package sse 提供 Server-Sent Events 的轻量封装,屏蔽 SSE 在 Go 里的常见坑: 自动设置流式响应头、解除本连接的写超时(避免被 server WriteTimeout 掐断)、 每条事件后自动 flush(穿透 otelhttp / compress 等包装链)、客户端断开时结束。
Package stream 提供流式扇出(广播)原语:把一个事件源 fan-out 给多个订阅者, 适合 SSE / WebSocket 等"一份数据推给 N 个连接"的场景。
Package stream 提供流式扇出(广播)原语:把一个事件源 fan-out 给多个订阅者, 适合 SSE / WebSocket 等"一份数据推给 N 个连接"的场景。
Package tally 提供高频累计聚合 + 批量刷写:把海量小额增量在内存里按 key 累加, 定时(或攒够阈值)合并成一批交给 flush 回调一次性处理,削平写放大。
Package tally 提供高频累计聚合 + 批量刷写:把海量小额增量在内存里按 key 累加, 定时(或攒够阈值)合并成一批交给 flush 回调一次性处理,削平写放大。
Package token 提供会话令牌的全生命周期管理:签发、验证、续签、注销。
Package token 提供会话令牌的全生命周期管理:签发、验证、续签、注销。
Package txn 提供跨域事务协调:让 wallet/storage/notification 等域包 在一个逻辑事务边界内原子提交或全部回滚。
Package txn 提供跨域事务协调:让 wallet/storage/notification 等域包 在一个逻辑事务边界内原子提交或全部回滚。
utils
Package vars 提供轻量的 ${KEY} 变量插值,零依赖。
Package vars 提供轻量的 ${KEY} 变量插值,零依赖。
Package versus 提供"限时多方对抗计分"原语:N 个阵营在一段倒计时内实时累计分, 到点定胜负。
Package versus 提供"限时多方对抗计分"原语:N 个阵营在一段倒计时内实时累计分, 到点定胜负。
Package webhook 提供事件驱动的 Webhook 通知:按事件类型过滤、自定义 header、 可选 body 模板、可选 HMAC 签名,异步触发并带指数退避重试。
Package webhook 提供事件驱动的 Webhook 通知:按事件类型过滤、自定义 header、 可选 body 模板、可选 HMAC 签名,异步触发并带指数退避重试。
ws
Package ws 基于 github.com/coder/websocket 提供 WebSocket 的轻量封装: 自动完成握手升级、统一关闭语义,并把 *http.Request 透传给业务, 便于读取 query / header / 子协议 / 鉴权信息。
Package ws 基于 github.com/coder/websocket 提供 WebSocket 的轻量封装: 自动完成握手升级、统一关闭语义,并把 *http.Request 透传给业务, 便于读取 query / header / 子协议 / 鉴权信息。
session
Package session 提供基于 WebSocket 的有状态会话高阶封装。
Package session 提供基于 WebSocket 的有状态会话高阶封装。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL