在Go中,如何使用匿名字段方法获取TypeOf类型?

Thi*_*lse 5 go

如何使用匿名字段(或超类)获取正确的结构类型?

我试图让这条鱼形容自己是一个鳕鱼:

package main

import (
    "fmt"
    "reflect"
)

type Fish struct {
}

func (self *Fish) WhatAmI() string {
    return reflect.TypeOf(self).String()
}

type Cod struct {
    Fish
}

func main() {
    c := new(Cod)
    fmt.Println("I am a", c.WhatAmI())
}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

I am a *main.Fish
Run Code Online (Sandbox Code Playgroud)

我想要的是:

I am a *main.Cod
Run Code Online (Sandbox Code Playgroud)

zzz*_*zzz 9

得到正确的答案.你想得到的答案是错误的.

func (f *Fish) WhatAmI() string {
        return reflect.TypeOf(f).String()
}
Run Code Online (Sandbox Code Playgroud)

f 类型*main.Fish,它甚至被声明为该类型(f *Fish).因此,它不能永远是类型*main.Cod.

可能的混淆源:方法集Cod继承其嵌入的匿名字段的方法集,Fish并且不会覆盖它.因此调用WhatAmI一个Cod"委托" 实例调用Fish.WhatAmI,接收器现在是嵌入式字段*main.Fish.

覆盖继承方法的示例:

package main

import (
        "fmt"
)

type Fish struct {
}

func (f *Fish) WhatAmI() string {
        return fmt.Sprintf("%T", f)
}

type Cod struct {
        Fish
}

func (c *Cod) WhatAmI() string {
        return fmt.Sprintf("%T", c)
}

func main() {
        c := new(Cod)
        fmt.Println("I am a", c.WhatAmI())
}
Run Code Online (Sandbox Code Playgroud)

操场


输出:

I am a *main.Cod
Run Code Online (Sandbox Code Playgroud)