在go中声明空类型

在go中声明空类型,go,Go,对于给定类型的数据,我想定义一组过滤器,每个过滤器以某种方式处理数据。一些过滤器只需要处理数据,其他过滤器可能需要附加参数 type Data struct { ... } 我希望能够定义过滤器列表,并将其顺序应用于数据的实例。为了实现这一点,我定义了一个过滤器接口: type Filter interface { Apply (d *Data) error } 要定义过滤器,我所要做的就是创建一个新类型并为其定义Apply方法 现在,假设我有一个过滤器,它不需要任何额外的信

对于给定类型的
数据
,我想定义一组过滤器,每个过滤器以某种方式处理
数据
。一些过滤器只需要处理数据,其他过滤器可能需要附加参数

type Data struct {
    ...
}
我希望能够定义过滤器列表,并将其顺序应用于
数据的实例。为了实现这一点,我定义了一个
过滤器
接口:

type Filter interface {
    Apply (d *Data) error
}
要定义过滤器,我所要做的就是创建一个新类型并为其定义Apply方法

现在,假设我有一个过滤器,它不需要任何额外的信息将其定义为空的
结构是一种好做法吗?

type MySimpleFilter struct {}

func (f *MySimpleFilter) Apply (d *Data) {
    ...
}

这是一个没有明确答案的问题,因为这是一个品味问题。我认为这是一种很好的做法,因为它使MySimpleFilter与其他过滤器对称,这使代码更容易理解。

如果您不使用字段,那么这是一种很好的做法,尤其是与使用另一种类型(即
类型MySimpleFilter int
)相比,因为空结构不使用空格:

而且它仍然可以实现接口契约(因此在某些情况下比函数方法更有用)

当使用对值没有用处的映射(即
map[string]struct{}
)时,这也是一个很好的习惯用法。有关详细信息,请参阅此讨论:


采用功能性更强的方法,让Apply方法Filter返回一个新的数据实例,而不必修改数据,不是更好吗?