Golang:使用另一个结构键入assign
所以我在这里有这个例子:
Go Playground package main import ( "fmt" ) type Circle struct{} func (c Circle) Something() { fmt.Println("something") } type Rectangle struct { Circle } func (a Rectangle) SomethingElse() { fmt.Println("SomethingElse") } type Form Rectangle func main() { c := Form{} c.Circle.Something() c.SomethingElse() } 我不明白为什么我可以从嵌入的Circle中调用Something,但不能从Form类型中的Rectangle调用Somethingelse.另外,我不明白当我声明一种其他类型的类型时会得到什么好处,比如Form中的类型.
这个:
type Form Rectangle 创建一个名为Form的新类型,将Rectangle作为其基础类型. 这意味着将为Form定义Rectangle(这是一个struct)的字段. 但是方法绑定到特定类型.当您创建新类型(Form)时,该新类型将不具有其基础类型的任何方法,因此您不能调用c.SomethingElse(),因为SomethingElse()是Rectangle类型的方法. c.Circle.Something()有效,因为c.Circle是Circle类型的字段,而Something()是Circle类型的方法. 如果要调用Rectangle.SomethingElse()方法,则需要Rectangle类型的值(接收器类型为Rectangle).由于Form的基础类型是Rectangle,因此您可以使用简单类型conversion从Form类型的值中获取Rectangle类型的值: Rectangle(c).SomethingElse() // This works 创建新类型的好处是,您可以为它创建/添加自己的方法.一个常见的例子是实现 type SortRectangle []Rectangle func (s SortRectangle) Len() int { return len(s) } func (s SortRectangle) Less(i,j int) bool { return s[i] <some-logic> s[j] } func (s SortRectangle) Swap(i,j int) { s[i],s[j] = s[j],s[i] } sort.Sort()函数能够对实现sort.Interface的任何值进行排序. [] Rectangle没有,但我们刚刚创建了一个新类型的SortRectangle.如果我们有一个类型为[] Rectangle的值,我们可以将它转换为SortRectangle,因为前者是后者的基础类型,通过转换,我们有一个SortRectangle类型的值,可以传递给sort.Sort (),为了让它排序: rs := []Rectangle{} // Sort rs: sort.Sort(SortRectangle(rs)) 请注意,像上面的SortRectangle(rs)这样的转换只会更改运行时类型信息,它不会更改rs的内存表示,因此它非常安全和高效. 如果您希望新类型具有“旧”类型的方法,则使用嵌入.见Ainar-G的答案.事实上,你已经通过在Circle中嵌入Circle来做到这一点:Rectangle类型有一个Something()方法,因为Something()是Circle的一个方法: Rectangle{}.Something() // Prints "something" (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |