3

对于给定的类型Data,我想定义一组过滤器,每个过滤器都Data以某种方式处理。有些过滤器只需要处理数据,有些可能需要额外的参数。

type Data struct {
    ...
}

我希望能够定义一个过滤器列表,并将它们顺序应用到Data. 为了实现这一点,我定义了一个Filter接口:

type Filter interface {
    Apply (d *Data) error
}

要定义过滤器,我所要做的就是创建一个新类型并为其定义 Apply 方法。

现在,假设我有一个不需要任何附加信息的过滤器。将其定义为空是一种好习惯struct吗?

type MySimpleFilter struct {}

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

2 回答 2

6

如果您没有使用 Field,我认为这是一种很好的做法,特别是与使用另一种类型(即type MySimpleFilter int)相比,因为空结构不使用空间:

https://codereview.appspot.com/4634124

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

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

https://groups.google.com/forum/?fromgroups=#!topic/golang-nuts/lb4xLHq7wug

于 2013-01-22T16:45:09.017 回答
0

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

于 2013-01-22T10:43:54.050 回答