在Go语言中,嵌入第三方类型是一种强大的功能,可以让我们在不修改原有代码的情况下扩展和定制已有的类型。通过嵌入第三方类型,我们可以继承其方法和属性,实现代码的复用和扩展。本文将为您介绍如何在Go语言中嵌入第三方类型,并给出一些实际应用场景的示例。无论您是Go语言的初学者还是有一定经验的开发者,相信本文都能为您提供实用的指导。
问题内容
在我的应用程序中,使用了 decimal 包 github.com/shopspring/decimal。
为了在 decimal.decimal
类型上编写自定义函数,我创建了自己的 decimal
类型并嵌入了 decimal.decimal
:
type decimal struct {
decimal.decimal
}
登录后复制
这很好用,我现在可以访问 decimal
对象上的方法:
a := decimal{decimal.newfromfloat(1.0)}
b := decimal{a.neg()}
登录后复制
某些 decimal.decimal
方法需要 decimal.decimal
, f.ex 类型的参数:
c := decimal{a.add(b)}
登录后复制
上面的行由于错误而无法编译:cannot use b (decimal类型的变量)作为十进制。a.add
参数中的十进制值
我尝试将 decimal
转换为 decimal.decimal
:
c := decimal{a.add((decimal.decimal)(b))}
登录后复制
由于以下错误,上述代码无法编译:
cannot convert b (variable of type Decimal) to decimal.Decimal
登录后复制
问题:如何以允许使用“父”方法的方式扩展/嵌入第三方类型并且可以使用扩展类型作为方法中的参数这需要父母类型的论证吗?
解决方法
使用类型声明但没有显式字段名称的字段称为嵌入字段。嵌入字段必须指定为类型名称 t 或指向非接口类型名称 *t 的指针,并且 t 本身可能不是指针类型。 非限定类型名称充当字段名称。
因此,一个快速而肮脏的解决方案是简单地使用“非限定类型名称”访问该字段。
_ = decimal{a.add(b.decimal)}
登录后复制
但是,如果您在使用新类型时寻求更无缝的体验,那么您唯一的选择就是重新声明需要原始类型的方法并在其位置使用新类型。这些重新声明的方法只需是将一个实例的嵌入字段传递给另一实例的嵌入字段的方法的简单包装器。例如:
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)
}
登录后复制
以上就是如何在 Go 中嵌入第三方类型?的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!