「ジェネリック」型を使用して方程式を計算するパッケージをGoで作成しようとしています。具体的には、ルンゲクッタ5近似を実装したいと思います。
この近似は、 atの値、開始時間、ステップ幅、および関数がどこにあるかという形式の微分方程式のみを使用y
して、その点での(未知の)関数の値を計算します。t0 + h
y
t0
t0
h
dgl
dy/dt = g(t,y)
g
この近似は、スカラー型を操作する場合とベクトル(または行列)を操作する場合とまったく同じように動作します。より一般的に言えば、同じタイプの値に加算/減算でき、スカラー(私が使用しているfloat64
)でスケーリングできるすべてのもので機能します
だから私はこれをGoインターフェースとして表現しようとしました:
type Numeric interface {
Add(rhs Numeric) Numeric
Sub(rhs Numeric) Numeric
Mul(rhs float64) Numeric
}
しかし、このインターフェースを「実装」しようとすると、パラメーターのタイプが原因で問題が発生しました。
type Vec6F struct {
x, y, z float64
vx, vy, vz float64
}
func (lhs *Vec6F) Add(rhs *Vec6F) rk5.Numeric {
result := new(Vec6F)
result.x = lhs.x + rhs.x
result.y = lhs.y + rhs.y
result.z = lhs.z + rhs.z
result.vx = lhs.vx + rhs.vx
result.vy = lhs.vy + rhs.vy
result.vz = lhs.vz + rhs.vz
return result
}
これは私にエラーを与えます
cannot use result (type *Vec6F) as type rk5.Numeric in return argument:
*Vec6F does not implement rk5.Numeric (wrong type for Add method
have Add(*Vec6F) rk5.Numeric
want Add(rk5.Numeric) rk5.Numeric
これは、一方では絶対に私にとって論理的です(rhsはNumericを実装する別のオブジェクトである可能性があるため)
しかし一方で、Goでそのようなことをどのように表現すればよいでしょうか。C ++では、代わりに演算子のオーバーロードを使用できましたが、それはgoでは不可能です。