Golang 中 WithOptions 模式的组合

Composition For WithOptions Pattern in Golang

提问人:404 提问时间:11/4/2023 最后编辑:404 更新时间:11/4/2023 访问量:37

问:

在golang中,有一个非常酷的可变选项模式,如

CallSomeStaff(mandatoryArg, WithSomeVariadicOption(val1), WithOtherVariadicOption(val2))

但是,一旦我们想用任何可能添加自己的可变参数选项的晚餐函数来扩展逻辑,最佳/预期的做法(或至少是适当的解决方案)是什么?

这似乎很棘手,因为

  • 它本身的选项类型并不总是公开的,只是选项修饰符
  • 我不太确定,但它对我来说是接缝的。是事件中暴露了一种选项修饰符类型,其中私有只是最终的修饰符函数值

那么真的有可能顺利实现类似的东西吗?

func SupperWrapper(composedOptions ...SuperOrInheritedOptions) {
   superOptions := // filter for SuperOptions
   inheritedOptions := // filter for InheritedOptions

   doWhateverWith(superOptions)

   CallSomeWrappedStaff(...inheritedOptions)
}

作为选项类型的方法看起来太诡异了。interface{}

我能看到的最漂亮的东西是可以实现的,看起来像这样

SuperStaff(
  WithSupperOption1(), 
  WithSuperOption2(), 
  WithInheritedOptions(
    WithInheritedOption1(), 
    WithInheritedOption2(),
 ),
)

无论如何,最终都有可能将简单的选项组合作为

SuperStaff(
  WithSupperOption1(), 
  WithSuperOption2(), 
  WithInheritedOption1(), 
  WithInheritedOption2(),
)

晚餐问题是,一旦原始类型没有暴露给它自己的选项,甚至修饰符类型,真正的选择是什么。

P.S. 据我所知(作为最简单的解决方案),像这样的类型组合

type CompositeOptions = SuperOptions | InheritedOptions

在 Golang 中不受支持。不是吗?

感谢

GO 设计模式 组合 可选参数 可变参数

评论

0赞 jub0bs 11/4/2023
我不确定我是否确切地理解您想用该函数做什么。但我确实在 GopherCon Europe 2023 上的演讲中讨论了如何声明多个选项类型和工厂函数。这可能会有所帮助。SupperWrapper

答: 暂无答案