首页 > 解决方案 > 获取外部/父结构名称

问题描述

我面临一个 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),但我认为这不是一个好的解决方案。

标签: go

解决方案


GetStructNameParentnot类型的方法Child,Golang 也没有继承,而是有结构嵌入(也有接口嵌入),有点像继承,但有一个关键区别:

当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,方法的接收者是内部类型,而不是外部类型。

这基本上意味着当您调用 时GetStructName,方法的接收者是Parent(内部或嵌入类型),而不是Child.

这与典型的类继承根本不同,它解释了您所看到的行为。

这里有很好的记录。


推荐阅读