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

Go 为什么带有匿名结构字段的结构不满足在该类型的别名上定义的方法?,go,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()

我有一个在包外部定义的结构,我想附加一个方法。由于包反映的是原始类型,因此我不能在结构中使用别名,我必须使用原始类型。下面是我想做的事情:

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*播放器没有字段或方法PrintLocation
。如果我在
实体
上定义
PrintLocation()
方法,它就会工作。如果
别名
实体
是同一件事,编译器为什么会抱怨呢?

那不是别名
byte
uint8
是别名,但您创建的是一个新类型,
Alias
,其基本类型为
实体

不同的类型有自己的方法集,并且不从基础类型继承它们


因此,
实体
根本没有方法,
别名
打印位置()的方法

这里有一些错误:

1-
new(Player)
返回指向新分配的类型为
Player

您应该改用
Player{}


2-你的
PrintLocation
方法的接收者是
别名
,它与
实体
播放器

无关,为什么他需要类型为
播放器
的值而不是
*播放器
?我很感激你的回答!似乎违反直觉的是,
别名
实体
没有“is-a”关系。那么,能够以这种方式定义类型的实际目的是什么?@w.brian在您想要向无法控制的类型添加方法(实现接口)时,创建这样的新类型很有用。在某些情况下,您甚至可能希望在单个包中拥有它。假设您有一个使用
json.Marshal
编码的结构,但是您还需要有一个不包含多个字段的编码的“轻”版本;然后您可以创建一个新类型,向新类型添加一个MarshalJSON()函数,并在调用
json.Marshal
@w.brian Oh之前转换为新类型。如果您想“继承”方法,那么这种方法称为“嵌入”(请参阅)。它的工作原理与您试图实现的有点不同,但是您可以通过一些重构来使用它。