gpt4 book ai didi

go - 引用Golang接口(interface)方法中的implementation-type

转载 作者:IT王子 更新时间:2023-10-29 01:58:39 26 4
gpt4 key购买 nike

我想为任何实现 Distance() 方法的坐标类型事物定义一个接口(interface),该方法可用于计算与另一个相同类型的坐标类型事物的距离(可能是笛卡尔,可能是时间顺序,等等) .

这是总体思路:

    type Distancer interface {
Distance(other interface{}) int
}

但是,这并没有为 Distance() 的参数提供类型安全,它必须是相同的类型。例如,我可能有一个实现 Distance() 的 ParticularTime 结构;传递另一个 ParticularTime 对象作为参数是有意义的,但传递 ParticularLocation 根本没有意义。

我怀疑至少在某些情况下,这可能会在编译时被捕获,例如这显然是错误的:

    x := ParticularLocation{}
y := ParticularTime{}
distance := x.Distance(y)

有没有办法表达这个限制?或者我是否必须在 Distance() 的每个实现中进行运行时类型检查?

我是不是以错误的方式思考这个问题?

最佳答案

这是 expression problem 的同态.如果我们假设 distance 表示 euclidean distance,也相对容易概括。 ,这是广泛应用的合理假设。因为 Go 不支持 dependent types但是,或者任何花哨的东西,我们必须在我们想要支持的维度数量上做出合理的妥协,以支持类型安全。

让我们为前 3 个维度实现它。

type OneVectorer interface {
Vector() [1]float64
}

type TwoVectorer interface {
Vector() [2]float64
}

type ThreeVectorer interface {
Vector() [3]float64
}

然后是三个类型安全的方法:

func OneDimensionalDistance(a OneVectorer, b OneVectorer) float64 {
return euclideanDistance(a.Vector()[:], b.Vector()[:])
}

func TwoDimensionalDistance(a TwoVectorer, b TwoVectorer) float64 {
return euclideanDistance(a.Vector()[:], b.Vector()[:])
}

func ThreeDimensionalDistance(a ThreeVectorer, b ThreeVectorer) float64 {
return euclideanDistance(a.Vector()[:], b.Vector()[:])
}

func euclideanDistance(a, b []float64) float64 {
// invariant: a and b have same length
c := 0.0
for i, _ := range a {
c += math.Pow(b[i]-a[i], 2)
}
return math.Sqrt(c)
}

所以,一个时间点可以是一个 OneVectorer,一个笛卡尔点可以是一个 TwoVectorer,等等......

您可以根据自己的方便定义更多类型,以使程序更具表现力,并在它们的方法中映射到此向量算法。

关于go - 引用Golang接口(interface)方法中的implementation-type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38750390/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com