如何从GO结构获取嵌入式类型?

I am trying to get embedded type from Go structs. Below is an example program that demonstrates this. Is there a way to write myfunc() without enumerating every type that can come in as input? https://play.golang.org/p/5wp14O660m

package main

import (
    "fmt"
)

type ObjectMeta struct {
    Name string
    Namespace string
}

type A struct {
    ObjectMeta
    X string
}

type B struct {
    ObjectMeta

    X string
}

func myfunc(v interface{}) ObjectMeta {
    switch u := v.(type) {
    case *A:
        return u.ObjectMeta
    case A:
        return u.ObjectMeta
    case *B:
        return u.ObjectMeta
    case B:
        return u.ObjectMeta
    }
    panic("No matching type")
}

func main() {
    fmt.Println(myfunc(&A{}))

    var v interface{} = &A{}
    fmt.Println(v.(*ObjectMeta))
}

ObjectMeta, A, B structs exist in external project. I have no control over them.

It can be done using reflection, iterating through the fields of the incoming value:

func myfunc(v interface{}) ObjectMeta {
    // Elem() to de-reference pointer
    ifv := reflect.ValueOf(v).Elem()
    ift := reflect.TypeOf(v).Elem()

    for i := 0; i < ift.NumField(); i++ {
        f := ift.Field(i)
        if f.Name == "ObjectMeta" {
            fv := ifv.Field(i)
            return fv.Interface().(ObjectMeta)
        }
    }
    panic("ObjectMeta not found")
}

Playground: https://play.golang.org/p/CzMHJWhxYr

You can define interface which will get you that embedded type:

package main

import (
    "fmt"
)

type HasMeta interface {
    GetMeta() ObjectMeta
}

type ObjectMeta struct {
    Name      string
    Namespace string
}

func (o ObjectMeta) GetMeta() ObjectMeta {
    return o
}

type A struct {
    ObjectMeta
    X string
}

type B struct {
    ObjectMeta
    X string
}

func myfunc(o HasMeta) ObjectMeta {
    return o.GetMeta()
}

func main() {
    fmt.Println(myfunc(&A{}))
    fmt.Println(myfunc(A{}))
    fmt.Println(myfunc(&B{}))
    fmt.Println(myfunc(B{}))
}

https://play.golang.org/p/CWa4k-kvvl