我来自Node.js背景,一个典型的模式是有一个带有选项对象的函数,即为可选参数设置属性的对象,例如:
foo({
bar: 23,
baz: 42
});
这是JavaScript"等同于"可选和命名参数。
现在我已经了解到Go中没有可选参数,除了可变参数,但它们缺乏命名参数的可读性。所以通常的模式似乎是移交结构。
OTOH结构不能用默认值定义,所以我需要一个函数来设置结构。
所以我最终得到了:
与JavaScript的解决方案相比,这非常复杂和冗长。
这实际上是在Go中处理可选和命名参数的惯用方法,还是有更简单的版本?
答案 0 :(得分:4)
有什么方法可以利用零值?所有数据类型都被初始化为零值,因此这是一种默认逻辑形式。
选项对象是一种非常常见的习惯用法。 etcd client library有一些示例(SetOptions,GetOptions,DeleteOptions),类似于以下内容。
tableView
一个相关的问题(在Go的思维模式中)会是,你需要这种复杂性吗?灵活性很好,但标准库中的大多数东西试图一次只处理1个默认的信息/逻辑片段以避免这种情况。
答案 1 :(得分:0)
这种方法是否有用取决于场景,但在某些情况下,至少你可以使用map
。
如果所有选项属于同一类型,请使用map[string]type
。这为您提供了命名选项以及您想要的少数或多数。
他们的存在很容易用
之类的东西来测试if val, exists := opts["bar"]; exists {
// Do something here
}
要设置默认值,您可以在创建地图时使用地图文字。
如果选项的类型不同,您可以使用map[string]interface{}
,这将允许任何类型存储在地图中。您只需要在检索后对值进行类型转换。