-
手掌心
这是由常见问题解答中的语言创建者回答的:面向对象的编程,至少在最著名的语言中,涉及对类型之间关系的过多讨论,这些关系通常可以自动派生。Go 采取了不同的方法。与其要求程序员提前声明两种类型是相关的,在 Go 中,类型会自动满足任何指定其方法子集的接口。除了减少簿记,这种方法还有真正的优势。类型可以同时满足多个接口,没有传统多重继承的复杂性。接口可以是非常轻量级的——具有一个甚至零方法的接口可以表达一个有用的概念。如果出现新想法或用于测试,可以事后添加接口——无需注释原始类型。因为类型和接口之间没有明确的关系,所以没有类型层次结构需要管理或讨论。另请参阅:组合优于继承原则。
-
三国纷争
如果你需要继承来重用,这个例子展示了我如何重用形状界面的宽度/高度,package main// compare to a c++ example: http://www.tutorialspoint.com/cplusplus/cpp_interfaces.htmimport ( "fmt")// interfacetype Shape interface { Area() float64 GetWidth() float64 GetHeight() float64 SetWidth(float64) SetHeight(float64)}// reusable part, only implement SetWidth and SetHeight method of the interface// {type WidthHeight struct { width float64 height float64}func (this *WidthHeight) SetWidth(w float64) { this.width = w}func (this *WidthHeight) SetHeight(h float64) { this.height = h}func (this *WidthHeight) GetWidth() float64 { return this.width}func (this *WidthHeight) GetHeight() float64 { fmt.Println("in WidthHeight.GetHeight") return this.height}// }type Rectangle struct { WidthHeight}func (this *Rectangle) Area() float64 { return this.GetWidth() * this.GetHeight() / 2}// overridefunc (this *Rectangle) GetHeight() float64 { fmt.Println("in Rectangle.GetHeight") // in case you still needs the WidthHeight's GetHeight method return this.WidthHeight.GetHeight()}func main() { var r Rectangle var i Shape = &r i.SetWidth(4) i.SetHeight(6) fmt.Println(i) fmt.Println("width: ",i.GetWidth()) fmt.Println("height: ",i.GetHeight()) fmt.Println("area: ",i.Area())}结果:&{{4 6}}width: 4in Rectangle.GetHeightin WidthHeight.GetHeightheight: 6in Rectangle.GetHeightin WidthHeight.GetHeightarea: 12
-
白衣非少年
我认为嵌入足够接近定义:package mainimport "net/url"type address struct { *url.URL }func newAddress(rawurl string) (address, error) { p, e := url.Parse(rawurl) if e != nil { return address{}, e } return address{p}, nil}func main() { a, e := newAddress("https://stackoverflow.com") if e != nil { panic(e) } { // inherit s := a.String() println(s) } { // fully qualified s := a.URL.String() println(s) }}https://golang.org/ref/spec#Struct_types