在我的应用程序中,使用了Decimal包github.com/shopspring/decimal。
为了在decimal.Decimal
类型上编写自定义函数,我创建了自己的Decimal
类型并嵌入了decimal.Decimal
:
type Decimal struct {
decimal.Decimal
}
这样做效果很好,现在我可以访问Decimal
对象上的decimal.Decimal
方法了:
a := Decimal{decimal.NewFromFloat(1.0)}
b := Decimal{a.Neg()}
某些decimal.Decimal
方法需要类型为decimal.Decimal
的参数,例如:
c := Decimal{a.Add(b)}
由于错误,无法编译上面的行:cannot use b (variable of type Decimal) as decimal.Decimal value in argument to a.Add
我尝试过将Decimal
转换为decimal.Decimal
:
c := Decimal{a.Add((decimal.Decimal)(b))}
由于以下错误,上述代码无法编译:
cannot convert b (variable of type Decimal) to decimal.Decimal
**问题:**如何扩展/嵌入第三方类型以允许使用“父”方法 * 并且 * 可以使用扩展的类型作为需要父类型参数的方法中的参数?
1条答案
按热度按时间yhuiod9q1#
用类型声明但没有显式字段名的字段称为嵌入字段。嵌入字段必须指定为类型名T或指向非接口类型名 *T的指针,并且T本身不能是指针类型。未限定的类型名用作字段名。
因此,一个快速而粗略的解决方案是使用“非限定类型名”简单地访问字段。
然而,如果你想在使用新类型时获得更无缝的体验,那么你唯一的选择就是重新声明那些需要原始类型的方法,并使用新类型代替它。这些重新声明的方法只需要是简单的 Package 器,将一个示例的嵌入字段传递给另一个示例的嵌入字段的方法。例如: