将类型声明为
指针
到另一个类型几乎从来都不是您想要的,因为Go不允许您向该新类型添加方法,也不允许您向该类型的指针添加方法。这个也不能编译:
type T struct{}
type P *T
func (P) M() {}
如果您想在不“隐藏”现有功能的情况下“扩展”一个类型,那么最好将其嵌入到结构中。
type T struct{
}
func (T) M() {}
type U struct {
*T
}
func NewU() *U {
return &U{&T{}}
}
func (U) N() {}
func main() {
u := NewU()
u.M()
u.N()
}
我所说的“隐藏现有功能”是指,当你用另一个已经存在的类型定义一个新类型时,你的新类型将不会
直接的
访问现有类型的方法。你所做的只是说你的新类型应该有相同的
结构
作为已存在的类型。尽管值得指出的是,该属性使您能够
转换
一种类型到另一种类型。。。
type T struct{
}
func (T) M() {}
type U T
func NewU() *U {
return &U{}
}
func (U) N() {}
func main() {
u := NewU()
u.M()
u.N()
(*T)(u).M()
}