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