卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章35042本站已运行393

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

如何在 go 中嵌入第三方类型?

在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)
}
卓越飞翔博客
上一篇: 重定向后 Golang 与 Gin 中的 CORS 错误
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏