Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types Go中调用嵌入类型重载方法的正确方法_Types_Go_Embedding - Fatal编程技术网

Types Go中调用嵌入类型重载方法的正确方法

Types Go中调用嵌入类型重载方法的正确方法,types,go,embedding,Types,Go,Embedding,我有一个界面: package pkg type BaseInterface interface { func Nifty() bool func Other1() func Other2() ... func Other34123() } 以及实现它的结构: package pkg type Impl struct {} func (Impl) Nifty() bool { ... } 然后出现了另一个结构,它希望嵌入第一个并

我有一个界面:

 package pkg
 type BaseInterface interface {
     func Nifty() bool
     func Other1() 
     func Other2()
     ...
     func Other34123()
 }
以及实现它的结构:

 package pkg
 type Impl struct {}
 func (Impl) Nifty() bool { ... }
然后出现了另一个结构,它希望嵌入第一个并实现自己的Nifty():

这有点像OOP语言中具有方法重写的类固有性。我想知道如何执行implToo.super().Nifty()的等效操作-也就是说,从implToo Nifty()实现调用pkg.Impl Nifty()实现

it
上使用什么样的正确转换才能完成此任务?我尝试的所有操作都会在ImplToo的Nifty()上产生无界递归,或者产生一些编译器错误,例如:

无效的类型断言:(&it)。(BaseInterface)(非接口类型*左侧的it)

。。。或者在这方面有很多变化。

你正在寻找

 type ImplToo struct {
     pkg.Impl
 }

func (it ImplToo) Nifty() bool { return it.Impl.Nifty() }
你对指针的使用不一致,这可能是你问题的一部分(不是积极的)。如果希望将嵌入类型设置为指针,那么也可以将接收类型的方法设置为指针,以避免此问题


如果要在嵌入类型中显式使用方法,请使用通常具有属性名称的类型引用它。

正如@evanmcdonnal所说。你的俏皮女郎要么需要一个指针,要么不需要。如果将指针嵌入到
pkg.Impl
,那么您的漂亮函数需要接受结构指针。如果您的漂亮函数不接受指针,那么嵌入的类型就不应该是指针

这是一个嵌入式指针,可以工作

·>猫主围棋

package main

import (
    "cs/pkg"
    "fmt"
)

type ImplToo struct {
    *pkg.Impl
}

func (it *ImplToo) Nifty() bool {
    fmt.Printf("Impl.Nifty() is %t\n", it.Impl.Nifty())
    return false
}

func main() {
    i := new(ImplToo)
    fmt.Println(i.Nifty())
}
·>cat cs/pkg/test.go

package pkg

type BaseInterface interface {
    Nifty() bool
}

type Impl struct{}

func (i *Impl) Nifty() bool {
    return true
}
输出:

Impl.Nifty() is true
false

你试过了吗?我试过了。问题是我的实际“Impl”的名称实际上类似于“name.withADot”,因此解析告诉我相当于
(type Impl也没有字段或方法名)
,这似乎让我觉得“OK,parens then”,但它(name.withADot)。Nifty被解析为接口转换,回到左边的
非接口类型
错误。我不明白。标识符不能包含点字符。请发布您的代码。但是类型会发布,因为它们是由包名限定的。点既是选择器又是包限定符。我对上面的内容进行了编辑,以反映我所说的内容。(当您嵌入时,/type name是字段名/。那么您如何选择它呢?等等)请注意我的编辑和上面的包前缀。ImplToo不是结构的有效声明,因为未定义Impl。它是本地包中的pkg.Impl。如果它是pkg.Impl,我会得到
(类型ImplToo没有字段或方法名pkg)
@BadZen好的,我解决了您对该包的担忧。它不影响Nifty的主体,只影响stucts声明。创建一个没有嵌入的新类型没有帮助-有一些带有类型接收器的函数以这种方式/不/“重载”,我希望能够从同一个表达式调用这些函数。您基本上是说“不要使用嵌入,编写所有内容”。这很好,直到我需要将我的类型传递给一些已经存在的需要BaseInterface的函数。还考虑调用MyIMPL。in ..Actual.Lo..Cu链。子类(…)……换一种方式:隐式/甚至不编译/除非我提供“管道代码”,它将接口的其他方法映射到IMPL。这对于大型接口来说是不可接受的…@BadZen ImplNotEmbed只是想向您展示如何访问嵌入类型与非嵌入类型的属性。这里没有构图。就像在OOP中一样,如果您希望重写派生类中的方法并使用基类实现,那么您必须显式声明。。。。如果您没有在
ImplToo
中重写
Nifty
,您可以直接从实例调用
Nifty()
。。。它被称为“ImplNotEmbed”,因为我没有使用嵌入…它现在工作得很好,指针在嵌入中,而不是在接收器中,我想。这是否意味着接收接口有一个额外的副本正在进行?当两者都是指针时,它不会编译:
ImplToo没有实现pkg.BaseInterface(漂亮的方法有指针接收器)
Impl.Nifty() is true
false