如何在Go语言中嵌入第三方类型?

vc9ivgsu  于 2023-01-10  发布在  Go
关注(0)|答案(1)|浏览(127)

在我的应用程序中,使用了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

**问题:**如何扩展/嵌入第三方类型以允许使用“父”方法 * 并且 * 可以使用扩展的类型作为需要父类型参数的方法中的参数?

yhuiod9q

yhuiod9q1#

用类型声明但没有显式字段名的字段称为嵌入字段。嵌入字段必须指定为类型名T或指向非接口类型名 *T的指针,并且T本身不能是指针类型。未限定的类型名用作字段名。
因此,一个快速而粗略的解决方案是使用“非限定类型名”简单地访问字段。

_ = Decimal{a.Add(b.Decimal)}

然而,如果你想在使用新类型时获得更无缝的体验,那么你唯一的选择就是重新声明那些需要原始类型的方法,并使用新类型代替它。这些重新声明的方法只需要是简单的 Package 器,将一个示例的嵌入字段传递给另一个示例的嵌入字段的方法。例如:

type Time struct {
    time.Time
}

func (t Time) In(loc *time.Location) Time {
    return Time{t.Time.In(loc)}
}

func (t Time) Equal(u Time) bool {
    return t.Time.Equal(u.Time)
}

相关问题