如何在 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
转换为 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 中嵌入第三方类型?的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

Go爬虫Colly中的Queue线程问题探讨在使用Go语言的Colly爬虫库时,开发者常常会遇到关于线程和请求队列的问题。�...

Go语言中用于浮点数运算的库介绍在Go语言(也称为Golang)中,进行浮点数的加减乘除运算时,如何确保精度是�...

关于Goland中自定义结构体标签的问题在使用Goland进行Go语言开发时,经常会遇到一些配置上的问题。其中一个常�...

Go语言中哪些库是大公司开发或知名开源项目?在使用Go语言进行编程时,开发者常常会遇到一些常见的需求,�...

Go语言中字符串打印的区别:使用Println与string()函数的效果差异在Go...

Go指针语法及viper库使用中的寻址问题在使用Go语言进行编程时,理解指针的语法和使用方法至关重要,尤其是在...

为什么Go语言中的map迭代会导致所有值变成最后一个元素?在Go语言中,面对一些面试题时,经常会遇到关于map�...

Go语言中结构体定义的两种方式:var与type关键字的差异Go语言在定义结构体时,经常会看到两种不同的写法:一�...
