为什么具有匿名struct字段的结构不满足在该类型的别名上定义的方法?

时间:2014-04-29 00:37:49

标签: go

我在我的包之外定义了一个结构,我想附加一个方法。由于包是反映原始类型的事实,我不能在我的结构中使用别名,我必须使用原始类型。以下基本上是我要做的:

package main

import "fmt"

type Entity struct {
    loc_x int
    loc_y int
}

type Player struct {
    Entity
    name string
}

type Alias Entity

func (e Alias) PrintLocation() {
    fmt.Printf("(%v, %v)", e.loc_x, e.loc_y)
}

func main() {
    player := new(Player)
    player.PrintLocation()
}

尝试编译此结果会导致type *Player has no field or method PrintLocation。如果我在PrintLocation()上定义Entity方法,则可行。如果AliasEntity完全相同,为什么编译器会抱怨?

2 个答案:

答案 0 :(得分:5)

这不是别名。 byteuint8是别名,但您创建的是新类型Alias,其基础类型为Entity

不同的类型有自己的一组方法,不会从基础类型继承它们。

因此Entity根本没有方法,Alias的方法为PrintLocation()

答案 1 :(得分:1)

这里有一些错误:

1 - new(Player)返回指向新分配的类型为Player的零值的指针 http://golang.org/doc/effective_go.html#allocation_new

您应该使用Player{}代替。

2 - PrintLocation方法的接收方为Alias,与EntityPlayer无关。