一尘不染

Golang中最灵活的功能签名

go

我的代码中有对象初始化程序,用于显式初始化对象的每个字段。但就我而言,大多数参数都有合理的默认值,我想使用它们。

在Python中,我通常使用关键字参数或默认值的组合,并且我的__init__方法包含一些验证逻辑,因此我可以在对象初始化中使用零配置原则。例如:

class Foo:
    """This class designed to show zero configuration
    principle in action"""
    def __init__(self, mandatory, optional=None, **kwargs):
        self.__field1 = mandatory
        self.__field2 = optional or make_default2()
        if 'bar' in kwargs:
            self.__field3 = kwargs['bar']
        else:
            self.__field3 = make_default3()


f = Foo('mondatory', bar=Bar())

Go中没有默认值的参数,也没有关键字参数或函数重载。因此,很难编写灵活的初始化代码(通常我不太在意此类代码的性能)。我想找到最惯用的方式在Go中编写此类代码。也许运行时类型反射和映射的某种组合可以完成任务,您认为呢?


阅读 398

收藏
2020-07-02

共1个答案

一尘不染

由于Go中新分配的内存始终为零,因此惯用的方法是通过以下方式显式使用此事实:

  • 将结构设计为具有合理的零值
  • 使用复合文字

看一下有效的Go的以下部分:http :
//golang.org/doc/effective_go.html#data

对于极其复杂的情况,有时还会使用配置结构(位于http://joneisen.tumblr.com/post/53695478114/golang-
and-default-values的选项3)NewConfigStruct(),该结构使用默认值初始化配置实例。用户生成一个默认实例,设置所需的字段,然后将其传递给New他们正在创建的实际结构的函数。

2020-07-02