当前位置: 首页 > 面试题库 >

带父结构嵌入父结构的调用函数不起作用

卢翔宇
2023-03-14
问题内容

对此有些困惑。请看游乐场。

我希望go允许您调用一个方法,该方法将一个父级与嵌入该父级的子级一起使用。

 package main

import (
    "fmt"
)

type Parent struct {
    A string
}

type Child struct {
    Parent 
}

func SomeFunction(parent Parent) {
    fmt.Println("%v", parent.A)
}

func main() {
    child := Child{Parent{A:"test"}}
    SomeFunction(child)  //prog.go:21: cannot use child (type Child) as type Parent in argument to SomeFunction
}

如果我使用“
child.Parent”来调用它,那么它可以工作,但是在那种情况下,我不能在函数中使用任何将值用作空接口的代码。对此进行了Google搜索,发现了一个非常有趣且有用的页面。
从OOP的角度看Golang的概念。欢迎就我在这里缺少的内容提供任何指导。也许这只是我在这里没有完全“了解” Golang。


问题答案:

Go不支持继承,因此不存在父母和子女的概念。这使名称在以下文本中令人困惑。它还表明您需要在重新实现继承与以类似方式设计数据结构之间进行思维上的飞跃。这个问题花了我一些时间来解决这个问题,答案是
“不要从继承层次结构开始,不知道如何在html" target="_blank">继承中进行,从go开始并设计要使用可用工具进行的工作”

SomeFunction定义为将a
Parent作为参数,因此必须将其作为父级传递。如果您想让孩子通过,请执行以下操作,即使用:

SomeFunction(child.Parent)

这就是传递嵌入式结构的方法。

但是,我怀疑您真正想做的是声明一个名为的接口ParentChild实现它,并SomeFunction采用一个Parent接口。您的困惑将是当前Parent拥有一个数据成员,而接口仅具有功能。最简单的修复方法取决于您要执行的操作,但是一种途径是提供另一种函数来返回数据成员。然后,所有“子”类都可以嵌入此数据成员,而函数可以返回它(或指向它的指针)。但是,如果您对要尝试做的事情没有一个更清晰的了解,那只是猜测。



 类似资料:
  • 问题内容: 这里是带有接口,父结构和2个子结构的Go代码示例 我有结果: 我的问题是对Circle和Rectangle调用哪种调用方法,而不是调用和方法。 这是Go中的错误吗? 谢谢你的帮助。 问题答案: 实际上,在您的示例中,对于a而言,调用工作正常,因为您为该类型创建了一个方法。由于您没有为类型创建,因此将调用嵌入式类型的方法。 这不是错误,这是预期的工作。Go 不是(相当)一种面向对象的语言

  • 问题内容: 问题是这样的:我有一个抽象类,该抽象类在其构造函数中执行某些工作,还有一组实现抽象类的子类: 然后,需要定制具体的类,一种解决方案是扩展具体的类: 但是问题在于自定义类仅需要调用抽象类的构造函数,而无需调用具体类的构造函数。 您如何实现的?更改班级关系的建议是有效的。 编辑:具体示例是ConcreteClass1和CustomizedClass1具有不同的数据集(ConcreteDat

  • 问题内容: 我想知道如何检索实例的父结构。 我不知道如何实现这一目标。 例如: 干杯 问题答案: 您应该保留一个指向引擎盖的指针。 当你增加房子 那么您可以轻松更改,尽管此时可能不需要吸气剂。

  • 问题内容: 我需要在PHP中有一个类构造函数,而不调用父构造函数来调用其父母的 父母 (祖父母?)构造函数。 我知道这是一件奇怪的事情,我正在尝试找到一种闻起来并不难闻的方法,但是尽管如此,我很好奇。 问题答案: 丑陋的解决方法是将一个布尔参数传递给Papa,指示您不希望解析其构造函数中包含的代码。即:

  • 问题内容: 是否可以在不使用嵌入式结构的情况下继承类型的方法? 代码的第一个片段是将结构嵌入其中的工作代码,我可以在上调用该方法。我不喜欢的是,当我初始化时,我有(?)来初始化其中的结构。有没有解决的办法? 最终,我想做以下事情。where 是类型和初始化位置,也不需要初始化结构。以下代码不起作用,但可能清楚我的目标是什么。 我将添加更多使用的方法的结构,这就是我要问的原因。如果只拥有,我将拥有可

  • 问题内容: 对于以下C代码: 对于Win32,我得到以下反汇编: 对于Linux32: 我试图了解呼叫后呼叫者的行为方式的差异。为什么Linux32中的调用程序会执行这些额外的操作? 我假设两个目标都将遵循cdecl调用约定。cdecl不会为返回结构的函数定义调用约定吗? 编辑: 我添加了被调用者的实现。可以肯定的是,您可以看到Linux32被调用方会弹出其参数,而Win32被调用方不会: Win