返回顶部
g

golang-samber-moGolang单子类型

Monadic types for Golang using samber/mo — Option, Result, Either, Future, IO, Task, and State types for type-safe nullable values, error handling, and functional composition with pipeline sub-packages. Apply when using or adopting samber/mo, when the codebase imports `github.com/samber/mo`, or when considering functional programming patterns as a safety design for Golang.

作者: admin | 来源: ClawHub
源自
ClawHub
版本
V 1.0.3
安全检测
已通过
149
下载量
免费
免费
0
收藏
概述
安装方式
版本历史

golang-samber-mo

角色定位: 你是一位将函数式编程安全性引入 Go 语言的 Go 工程师。你使用单子(monad)使不可能的状态变得不可表示——空指针检查变成类型约束,错误处理变成可组合的管道。

思维模式: 在设计多步骤的 Option/Result/Either 管道时,使用 ultrathink。错误的类型选择会导致不必要的包装/解包,从而违背了单子的目的。

samber/mo — Go 语言的单子与函数式抽象

Go 1.18+ 库,提供类型安全的单子类型,零依赖。灵感来自 Scala、Rust 和 fp-ts。

官方资源:

此技能并非详尽无遗。请参考库文档和代码示例以获取更多信息。Context7 可作为发现平台提供帮助。

bash
go get github.com/samber/mo

有关函数式编程概念介绍以及单子在 Go 语言中的价值,请参阅 单子指南

核心类型一览

类型用途可以将其视为...
Option[T]可能缺失的值Rust 的 Option,Java 的 Optional
Result[T]
可能失败的操作 | Rust 的 Result,替代 (T, error) | | Either[L, R] | 两种类型之一的值 | Scala 的 Either,TypeScript 的联合类型 | | EitherX[L, R] | X 种类型之一的值 | Scala 的 Either,TypeScript 的联合类型 | | Future[T] | 尚未可用的异步值 | JavaScript 的 Promise | | IO[T] | 惰性同步副作用 | Haskell 的 IO | | Task[T] | 惰性异步计算 | fp-ts 的 Task | | State[S, A] | 有状态计算 | Haskell 的 State 单子 |

Option[T] — 无 nil 的可空值

表示一个要么存在(Some)要么不存在(None)的值。在类型层面消除了空指针风险。

go
import github.com/samber/mo

name := mo.Some(Alice) // 带有值的 Option[string]
empty := mo.None[string]() // 不带值的 Option[string]
fromPtr := mo.PointerToOption(ptr) // nil 指针 -> None

// 安全提取
name.OrElse(Anonymous) // Alice
empty.OrElse(Anonymous) // Anonymous

// 存在则转换,不存在则跳过
upper := name.Map(func(s string) (string, bool) {
return strings.ToUpper(s), true
})

关键方法: Some、None、Get、MustGet、OrElse、OrEmpty、Map、FlatMap、Match、ForEach、ToPointer、IsPresent、IsAbsent。

Option 实现了 json.Marshaler/Unmarshaler、sql.Scanner、driver.Valuer — 可直接在 JSON 结构体和数据库模型中使用。

有关完整 API 参考,请参阅 Option 参考

Result[T] — 将错误处理作为值

表示成功(Ok)或失败(Err)。等同于 Either[error, T],但专门针对 Go 的错误模式进行了优化。

go
// 包装 Go 的 (value, error) 模式
result := mo.TupleToResult(os.ReadFile(config.yaml))

// 同类型转换 — 错误会自动短路
upper := mo.Ok(hello).Map(func(s string) (string, error) {
return strings.ToUpper(s), nil
})
// Ok(HELLO)

// 带默认值的提取
val := upper.OrElse(default)

Go 语言的限制: 直接方法(.Map、.FlatMap)无法更改类型参数 — Result[T].Map 返回 Result[T],而不是 Result[U]。Go 方法无法引入新的类型参数。对于更改类型的转换(例如,从 Result[[]byte] 到 Result[Config]),请使用子包函数或 mo.Do:

go
import github.com/samber/mo/result

// 类型更改管道:[]byte -> Config -> ValidConfig
parsed := result.Pipe2(
mo.TupleToResult(os.ReadFile(config.yaml)),
result.Map(func(data []byte) Config { return parseConfig(data) }),
result.FlatMap(func(cfg Config) mo.Result[ValidConfig] { return validate(cfg) }),
)

关键方法: Ok、Err、Errf、TupleToResult、Try、Get、MustGet、OrElse、Map、FlatMap、MapErr、Match、ForEach、ToEither、IsOk、IsError。

有关完整 API 参考,请参阅 Result 参考

Either[L, R] — 两种类型的联合

表示两种可能类型之一的值。与 Result 不同,任何一方都不暗示成功或失败——两者都是有效的备选方案。

go
// 返回缓存数据或新数据的 API
func fetchUser(id string) mo.Either[CachedUser, FreshUser] {
if cached, ok := cache.Get(id); ok {
return mo.LeftCachedUser, FreshUser
}
return mo.RightCachedUser, FreshUser)
}

// 模式匹配
result.Match(
func(cached CachedUser) mo.Either[CachedUser, FreshUser] { / 使用缓存 / },
func(fresh FreshUser) mo.Either[CachedUser, FreshUser] { / 使用新数据 / },
)

何时使用 Either 与 Result: 当某一路径是错误时,使用 Result[T]。当两条路径都是有效的备选方案(缓存 vs 新数据、左 vs 右、策略 A vs 策略 B)时,使用 Either[L, R]。

Either3[T1, T2, T3]、Either4 和 Either5 将此扩展到 3-5 种类型变体。

有关完整 API 参考,请参阅 Either 参考

Do 表示法 — 具有单子安全性的命令式风格

mo.Do 将命令式代码包装在 Result 中,捕获来自 MustGet() 调用的 panic:

go
result := mo.Do(func() int {
// MustGet 在 None/Err 时 panic — Do 将其捕获为 Result 错误
a := mo.Some(21).MustGet()
b := mo.Ok(2).MustGet()
return a * b // 42
})
// result 是 Ok(42)

result := mo.Do(func() int {
val := mo.None[int]().MustGet() // panic
return val
})
// result 是 Err(no such element)

Do 表示法将命令式 Go 风格与单子安全性连接起来——编写直线代码,获得自动错误传播。

管道子包与直接链式调用

samber/mo 提供了两种组合操作的方式:

直接方法(.Map、.FlatMap)——当输出类型等于输入类型时有效:

go
opt := mo.Some(42)
doubled := opt.Map(func(v int) (int, bool) {
return v * 2, true
}) // Option[int]

子包函数(option.Map、result.Map)——当输出类型与输入不同时需要:

go
import github.com/samber/mo/option

// int -> string 类型更改:使用子包 Map
strOpt := option.Map(func(v int) string {
return fmt.Sprintf(value: %d, v)
})(mo.Some(42)) // Option[string]

Pipe 函数(option.Pipe3、result.Pipe3)——以可读的方式链式调用多个类型更改转换:

go
import github.com/samber/mo/option

result := option.Pipe3(
mo.Some(42),
option.Map(func(v int) string { return strconv.Itoa(v) }),
option.Map(func(s string) []byte { return []byte(s) }),
option.FlatMap(func(b []byte) mo.Option[string] {
if len(b) > 0 { return mo.Some(string(b)) }
return mo.N

标签

skill ai

通过对话安装

该技能支持在以下平台通过对话安装:

OpenClaw WorkBuddy QClaw Kimi Claude

方式一:安装 SkillHub 和技能

帮我安装 SkillHub 和 golang-samber-mo-1776056480 技能

方式二:设置 SkillHub 为优先技能安装源

设置 SkillHub 为我的优先技能安装源,然后帮我安装 golang-samber-mo-1776056480 技能

通过命令行安装

skillhub install golang-samber-mo-1776056480

下载

⬇ 下载 golang-samber-mo v1.0.3(免费)

文件大小: 23.77 KB | 发布时间: 2026-4-14 13:15

v1.0.3 最新 2026-4-14 13:15
- Updated version metadata to 1.0.3 in SKILL.md.
- Added AskUserQuestion to the allowed-tools list.
- No technical or functionality changes to skill logic—documentation only.

Archiver·手机版·闲社网·闲社论坛·羊毛社区· 多链控股集团有限公司 · 苏ICP备2025199260号-1

Powered by Discuz! X5.0   © 2024-2025 闲社网·线报更新论坛·羊毛分享社区·http://xianshe.com

p2p_official_large
返回顶部