Documentation
¶
Overview ¶
Package optparams 管理“关键字参数”(函数选项, functional options)风格的模块。 思路参考自 grpc 项目的 option 设计,借助 Go 泛型消除重复代码。
核心语义区分:
- GetOption 是“纯函数”风格:基于传入的默认值做一次拷贝再解析,不会污染可复用的共享默认结构。
- Apply 是“原地”风格:直接把选项作用到已存在的结构体上,适用于对存量配置做叠加/覆盖(如 Init)。
Index ¶
Examples ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func Apply ¶ added in v1.0.0
Apply 将一组关键字参数原地作用到 target 上,并返回 target(原地语义)。
适用于对已存在的配置做叠加/覆盖(例如 Init 场景),与 GetOption 的“拷贝后解析”互补。 opts 中为 nil 的选项会被跳过;target 不能为 nil。
Example ¶
package main
import (
"fmt"
"github.com/Golang-Tools/optparams"
)
// PersonOpt 用于示例的关键字参数结构。
type PersonOpt struct {
Name string
Age int
}
// WithAge 返回设置年龄的选项。
func WithAge(age int) optparams.Option[PersonOpt] {
return optparams.NewFuncOption(func(o *PersonOpt) {
o.Age = age
})
}
func main() {
o := &PersonOpt{Name: "guest", Age: 18}
optparams.Apply(o, WithAge(30)) // 原地叠加,不改变 Name
fmt.Printf("%s(%d)\n", o.Name, o.Age)
}
Output: guest(30)
func GetOption ¶
GetOption 解析一组关键字参数并返回完整的配置实例(纯函数语义)。
它不会修改传入的 defaultopt:会先对 *defaultopt 做一次(浅)拷贝,再把 opts 应用到拷贝上并返回拷贝的指针。因此可以安全地传入可复用的共享默认值 (例如包级变量),多次调用也不会互相污染。 当 defaultopt 为 nil 时,以 T 的零值为起点解析;opts 中为 nil 的选项会被跳过。
注意:此处为浅拷贝;若 T 中包含指针、切片或 map 等引用类型字段,选项对这些 字段内容的修改仍会作用到底层共享对象。
需要“原地修改已有结构体”时,请改用 Apply。
Example ¶
package main
import (
"fmt"
"github.com/Golang-Tools/optparams"
)
// PersonOpt 用于示例的关键字参数结构。
type PersonOpt struct {
Name string
Age int
}
// WithName 返回设置姓名的选项。
func WithName(name string) optparams.Option[PersonOpt] {
return optparams.NewFuncOption(func(o *PersonOpt) {
o.Name = name
})
}
// WithAge 返回设置年龄的选项。
func WithAge(age int) optparams.Option[PersonOpt] {
return optparams.NewFuncOption(func(o *PersonOpt) {
o.Age = age
})
}
func main() {
opt := optparams.GetOption(&PersonOpt{Name: "guest", Age: 18}, WithName("alice"), WithAge(30))
fmt.Printf("%s(%d)\n", opt.Name, opt.Age)
}
Output: alice(30)
Types ¶
type FuncOption ¶
type FuncOption[T any] struct { // contains filtered or unexported fields }
FuncOption 是基于闭包实现的关键字参数项,通常作为 NewFuncOption 的返回值。 @generic T any 关键字参数对应的结构
func NewFuncOption ¶
func NewFuncOption[T any](f func(*T)) *FuncOption[T]
NewFuncOption 构造一个基于函数的关键字参数项。
例子:
func WithName(name string) optparams.Option[NameOpt] {
return optparams.NewFuncOption(
func(o *NameOpt) {
o.Name = name
})
}
@generic T any 关键字参数对应的结构
type Option ¶
type Option[T any] interface { Apply(*T) }
Option 是关键字参数项的形参类型。 任何实现了 Apply(*T) 方法的类型都可作为 Option[T] 使用。 @generic T any 关键字参数对应的结构
func Combine ¶ added in v1.0.0
Combine 将一组选项合并为单个 Option,便于复用与二次封装。 返回的选项会按给定顺序依次应用组内各选项;组内为 nil 的选项会被跳过。
Example ¶
package main
import (
"fmt"
"github.com/Golang-Tools/optparams"
)
// PersonOpt 用于示例的关键字参数结构。
type PersonOpt struct {
Name string
Age int
}
// WithName 返回设置姓名的选项。
func WithName(name string) optparams.Option[PersonOpt] {
return optparams.NewFuncOption(func(o *PersonOpt) {
o.Name = name
})
}
// WithAge 返回设置年龄的选项。
func WithAge(age int) optparams.Option[PersonOpt] {
return optparams.NewFuncOption(func(o *PersonOpt) {
o.Age = age
})
}
func main() {
both := optparams.Combine(WithName("bob"), WithAge(25))
opt := optparams.GetOption(&PersonOpt{}, both)
fmt.Printf("%s(%d)\n", opt.Name, opt.Age)
}
Output: bob(25)