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之前转换为新类型。如果您想“继承”方法,那么这种方法称为“嵌入”(请参阅)。它的工作原理与您试图实现的有点不同,但是您可以通过一些重构来使用它。