为了账号安全,请及时绑定邮箱和手机立即绑定

在字段(golang)中嵌入结构的目的是什么?

在字段(golang)中嵌入结构的目的是什么?

Go
叮当猫咪 2022-01-04 13:23:10
基于下面的示例,“在字段中嵌入结构”似乎是为了打破 Go 的“提升”机制。你为什么想做这个?type obj1 struct {    obj2}type obj1Selector struct {    selector obj2}type obj2 struct {}func (o obj2) printTest() {    fmt.Println("obj2")}func main() {    o := obj1{}    o.printTest() //fine    oSelector := obj1Selector{}    oSelector.selector.printTest() //fine    oSelector.printTest() //not fine
查看完整描述

1 回答

?
慕无忌1623718

TA贡献1744条经验 获得超4个赞

你没有别名任何东西,选择器是指可以使用点表示法在类型上引用的一组事物。您正在使用一个名为 embedding、obj1embeds的概念obj2obj1Selector有一个名为selectortype 的字段obj2。别名看起来像这样;type obj3 obj2它声明obj3obj2.

它打破了 Go 的提升机制?抱歉,您对如何工作的整个想法是断章取意的。obj1Selector不嵌入类型obj2,因此没有来自obj2'promoted'的字段/方法,obj1embeds obj2,因此它的字段/方法'promoted'。obj1Selector没有实现那个接口,obj1Selector.selector确实如此。

我为什么要嵌入?嗯,它有点等同于继承,或者至少在 Go 中开发时提供了类似的功能集。也许我在数据存储中有许多记录,它们都共享 10 个公共字段,然后还有另外 10 个字段,这些字段取决于它们来自哪个表。正如我会在典型的面向对象语言(如 C++、C# 或 Java)中使用继承来减少重复一样,我会在 Go 中使用嵌入。在我看来,这是它的主要用例。这是一种组合和继承的奇怪组合。您正在编写其他对象(您嵌入的对象)的对象,但由于嵌入类型的方法/字段被提升到嵌入器范围,因此它的功能很像嵌入器从嵌入类型继承的。希望对您在这里处理的事情有所澄清......你没有'


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 113 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信