如何在Go中提供可选参数?

时间:2016-04-13 06:00:07

标签: go optional-parameters named-parameters

我来自Node.js背景,一个典型的模式是有一个带有选项对象的函数,即为可选参数设置属性的对象,例如:

foo({
  bar: 23,
  baz: 42
});

这是JavaScript"等同于"可选和命名参数。

现在我已经了解到Go中没有可选参数,除了可变参数,但它们缺乏命名参数的可读性。所以通常的模式似乎是移交结构。

OTOH结构不能用默认值定义,所以我需要一个函数来设置结构。

所以我最终得到了:

  • 调用创建结构的函数,然后使用默认值填充它。
  • 覆盖我想要更改的值。
  • 调用我实际想要调用的函数并移交struct。

与JavaScript的解决方案相比,这非常复杂和冗长。

这实际上是在Go中处理可选和命名参数的惯用方法,还是有更简单的版本?

2 个答案:

答案 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{},这将允许任何类型存储在地图中。您只需要在检索后对值进行类型转换。