其内嵌套Phone和Camera两个struct,那么cameraPhone就可以获取来自Phone的call()方法进行拨号通话,获取来自Camera()的takeAPic()方法进行拍照。
面向对象的语言都强烈建议不要使用多重继承,甚至有些语言本就不支持多重继承。至于Go是否要使用"多重继承",看需求了,没那么多限制。
重写String()方法
fmt包中的Println()、Print()和Printf()的%v
都会自动调用String()方法将待输出的内容进行转换。
可以在自己的struct上重写String()方法,使得输出这个示例的时候,就会调用它自己的String()。
例如,定义person的String(),它将person中的name和age结合起来:
package main
import (
"fmt"
"strconv"
)
type person struct {
name string
age int
}
func (p *person) String() string {
return p.name + ": " + strconv.Itoa(p.age)
}
func main() {
p := new(person)
p.name = "longshuai"
p.age = 23
// 输出person的实例p,将调用String()
fmt.Println(p)
}
上面将输出:
longshuai: 23
一定要注意,定义struct的String()方法时,String()方法里不要出现fmt.Print()、fmt.Println以及fmt.Printf()的%v
,因为它们自身会调用String(),会出现无限递归的问题。