我在我的包之外定义了一个结构,我想附加一个方法。由于包是反映原始类型的事实,我不能在我的结构中使用别名,我必须使用原始类型。以下基本上是我要做的:
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
方法,则可行。如果Alias
和Entity
完全相同,为什么编译器会抱怨?
答案 0 :(得分:5)
这不是别名。 byte
和uint8
是别名,但您创建的是新类型Alias
,其基础类型为Entity
。
不同的类型有自己的一组方法,不会从基础类型继承它们。
因此Entity
根本没有方法,Alias
的方法为PrintLocation()
。
答案 1 :(得分:1)
这里有一些错误:
1 - new(Player)
返回指向新分配的类型为Player
的零值的指针
http://golang.org/doc/effective_go.html#allocation_new
您应该使用Player{}
代替。
2 - PrintLocation
方法的接收方为Alias
,与Entity
或Player
无关。