金融与交易
当在 Go 项目中使用或引入 samber/mo 库时,用…
适用于使用 samber/mo 库进行 Go 函数式编程,以类型安全地处理可空值、错误和异步/有状态计算。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
当在 Go 项目中使用或引入 sambe特定
解决思路
- 运行 `go get github.com/samber/mo` 安装 samber/mo 库。
- 使用 `mo.Some(value)` 创建有值的 `Option[T]`,使用 `mo.None[T]()` 创建无值的 `Option[T]`,使用 `mo.PointerToOption(ptr)` 将 nil 指针转为 `None`。
- 使用 `Option.OrElse(default)` 安全提取值,缺失时返回默认值。
- 使用 `Option.Map(func(T) (T, bool))` 在值存在时转换,缺失时跳过。
- 利用 `Option` 实现的 `json.Marshaler`/`json.Unmarshaler`、`sql.Scanner`、`driver.Valuer`,在 JSON 结构体和数据库模型中直接使用 `mo.Option[T]`。
- 使用 `mo.TupleToResult(value, error)` 将 Go 的 `(T, error)` 模式转换为 `Result[T]`。
- 使用 `Result.Map`/`Result.FlatMap` 对成功值做同类型转换,错误自动短路。
- 使用 `Result.OrElse(default)` 提取值或回退默认值。
- 当 `Result` 需要改变类型参数时,使用子包函数如 `result.Map`、`result.FlatMap` 或 `result.Pipe2`/`result.Pipe3`,或使用 `mo.Do`。
- 使用 `mo.Left`/`mo.Right` 构造 `Either[L, R]`,表示两种有效替代值。
- 使用 `Either.Match` 对两种类型分支处理。
- 根据语义选择类型:`Result[T]` 用于成功/错误路径,`Either[L, R]` 用于两个都有效的替代路径。
- 使用 `Either3`、`Either4`、`Either5` 表示 3-5 种类型变体。
- 使用 `mo.Do(func() T { ... })` 包装命令式代码,在 `MustGet()` panic 时自动捕获为 `Result` 错误。
- 在 `mo.Do` 块内使用 `MustGet` 安全获取值(panic 会被捕获),但优先使用 `OrElse` 而非 `MustGet`。
- 同类型转换使用直接方法(`.Map`/`.FlatMap`);类型改变使用子包函数(如 `option.Map`、`result.Map`)和管道函数(如 `option.Pipe3`、`result.Pipe3`)。
- 对 JSON API 响应,使用 `mo.Option[T]` 字段优雅省略 null。
- 对数据库可空列,使用 `mo.Option[T]` 字段并依赖其 `sql.Scanner`/`driver.Valuer` 实现。
- 使用 `mo.TupleToOption` 将 `(V, bool)` 的 map 查找转换为 `Option[V]`。
- 使用 `mo.Fold` 统一从 Option、Result 或 Either 中提取值,传入成功和失败处理函数。
- 优先使用 `OrElse` 而非 `MustGet`;仅在 `mo.Do` 块内或确定值存在时使用 `MustGet`。
- 在 API 边界使用 `TupleToResult` 将 `(T, error)` 转换为 `Result[T]`,然后在领域逻辑内用 `Map`/`FlatMap` 链式调用。
- 使用 `Option[T]` 表示可空字段,而非零值;当空字符串是有效值时使用普通 `string`。
- 用链式调用(如 `result.Map(...).FlatMap(...).OrElse(default)`)替代嵌套 if/else。
- 多步类型变换时使用子包管道函数(如 `option.Pipe3`),比嵌套函数调用更可读。
- 当需要使用 Future、IO、Task、State 等高级类型时,参考 `advanced-types.md`。
适用边界 · 注意事项
- 不适用于不依赖该库的 nil 安全和零值设计(应使用 `samber/cc-skills-golang@golang-safety` 技能)。
- 不适用于使用 `fmt.Errorf`、`errors.Is` 和 `errors.As` 的原生错误包装(应使用 `samber/cc-skills-golang@golang-error-handling` 技能)。