我的代码中有对象初始化程序,用于显式初始化对象的每个字段。但就我而言,大多数参数都有合理的默认值,我想使用它们。
在Python中,我通常使用关键字参数或默认值的组合,并且我的__init__方法包含一些验证逻辑,因此我可以在对象初始化中使用零配置原则。例如:
__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中编写此类代码。也许运行时类型反射和映射的某种组合可以完成任务,您认为呢?
由于Go中新分配的内存始终为零,因此惯用的方法是通过以下方式显式使用此事实:
看一下有效的Go的以下部分:http : //golang.org/doc/effective_go.html#data
对于极其复杂的情况,有时还会使用配置结构(位于http://joneisen.tumblr.com/post/53695478114/golang- and-default-values的选项3)NewConfigStruct(),该结构使用默认值初始化配置实例。用户生成一个默认实例,设置所需的字段,然后将其传递给New他们正在创建的实际结构的函数。
NewConfigStruct()
New