go - 获取外部/父结构名称
问题描述
我面临一个 Golang 初学者问题,我不知道如何正确解决它。请你帮助我好吗?
信息:尽管这违背了 Go 的概念(不是试图成为一种 OOP 语言),但我仍然想讨论一些解决方案。
我想知道接收器/子中的外部/父结构名称。请看下面的代码(操场: https: //play.golang.org/p/h6dARJQwidS)
package main
import (
"fmt"
"reflect"
)
type Parent struct {
Id uint32
}
func (p *Parent) GetStructName() string {
return reflect.TypeOf(p).Elem().Name()
}
type Child struct {
Parent
}
func main() {
myChild := Child{}
fmt.Println(myChild.GetStructName()) // Gives "Parent" instead of "Child". How to get "Child"?
}
尽管结构是“子”,但它显示“父”。谁能告诉我如何获得正确的结构名称?我在另一个 stackoverflow 主题中看到了一个“正确”工作的“解决方案”(Go - get parent struct),但我认为这不是一个好的解决方案。
解决方案
GetStructName
是Parent
not类型的方法Child
,Golang 也没有继承,而是有结构嵌入(也有接口嵌入),有点像继承,但有一个关键区别:
当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,方法的接收者是内部类型,而不是外部类型。
这基本上意味着当您调用 时GetStructName
,方法的接收者是Parent
(内部或嵌入类型),而不是Child
.
这与典型的类继承根本不同,它解释了您所看到的行为。
这里有很好的记录。