Go 如何编写具有不同签名的同一方法的多个实现

Go 如何编写具有不同签名的同一方法的多个实现,go,interface,Go,Interface,我有几个相同方法SetRateForMeasure的实现: 然后,在我的代码repartition.go中,我将其称为: rate := repartition.SetRateForMeasure(meter, measure, total) 其中,重新分区是之前定义的接口 问题是,当我添加此方法的新实现时,函数的参数可能会有所不同 例如,静态重新分区使用仅在本例中使用的静态百分比 我最终添加了参数,这样我就有了一个与所有方法的通用接口,但这会导致根据实现的不同,有很多未使用的参数 如果我将它

我有几个相同方法SetRateForMeasure的实现:

然后,在我的代码repartition.go中,我将其称为:

rate := repartition.SetRateForMeasure(meter, measure, total)
其中,重新分区是之前定义的接口

问题是,当我添加此方法的新实现时,函数的参数可能会有所不同

例如,静态重新分区使用仅在本例中使用的静态百分比

我最终添加了参数,这样我就有了一个与所有方法的通用接口,但这会导致根据实现的不同,有很多未使用的参数

如果我将它添加到公共接口,它将不用于其他定义

我试图从接口定义中删除此方法,但现在

rate := repartition.SetRateForMeasure()
没有更多的定义


如何组织代码?

Go中没有函数重载,因此不能用不同的参数声明同一个函数。不过,有几种方法可以实现这一点:

可以添加具有不同名称和签名的多个函数 可以将函数更改为接受结构而不是参数
Go中没有函数重载,因此不能用不同的参数声明同一个函数。不过,有几种方法可以实现这一点:

可以添加具有不同名称和签名的多个函数 可以将函数更改为接受结构而不是参数
Go不支持方法重写。你也是​使用不同的名称定义采用不同参数的方法 ​ 或者可以声明方法以接受参数结构

type SetRateParams struct {
    Meter    models.Meter
    Measure  models.Measure
    Total    float64
}

type Repartition interface {
    SetRateForMeasure(params SetRateParams) float64
}
或者,可以将结构中的参数声明为指针,因此可以使用nil表示未提供的语义,而不是使用零值。这可能与数值参数有关,其中0可能是有效值

使用struct param还有一个优点,即如果您决定在6个月后添加一个额外的param,您不必更改所有调用站点,只需将其添加到struct即可


为了说明什么是可能的,接口{}varargs也有更糟糕的解决方案,但除非您讨厌类型安全性,否则我不建议这样做。

Go不支持方法重写。你也是​使用不同的名称定义采用不同参数的方法 ​ 或者可以声明方法以接受参数结构

type SetRateParams struct {
    Meter    models.Meter
    Measure  models.Measure
    Total    float64
}

type Repartition interface {
    SetRateForMeasure(params SetRateParams) float64
}
或者,可以将结构中的参数声明为指针,因此可以使用nil表示未提供的语义,而不是使用零值。这可能与数值参数有关,其中0可能是有效值

使用struct param还有一个优点,即如果您决定在6个月后添加一个额外的param,您不必更改所有调用站点,只需将其添加到struct即可


为了说明什么是可能的,接口{}varargs也有更糟糕的解决方案,但除非您讨厌类型安全性,否则我不建议这样做。

哦,我明白了,我不会添加多个函数,因为所有这些函数都做相同的事情。我认为他们的名字是一致的。我将使用struct param!谢谢哦,我明白了,我不会添加多个函数,因为所有这些函数都做相同的事情。我认为他们的名字是一致的。我将使用struct param!谢谢
type SetRateParams struct {
    Meter    models.Meter
    Measure  models.Measure
    Total    float64
}

type Repartition interface {
    SetRateForMeasure(params SetRateParams) float64
}