go 接口
1.1 接口实例
//interface 接口是一组行为规范的集合
type interfaceninit1er interface { //定义接口,通常接口名以er结尾
//接口里面之定义方法,不定义变量
move(src string,int string) (int,error) //方法名(参数列表)返回值列表
whistle(int)int //参数列表和返回值列表里的变量名可以忽略
}
//interface接口实例
//接口唯一的好处就是函数还没开始写,这里就可以用上
//接口值有两部分组成,一个指向该接口的具体类型的指针和另外一个指向该具体类型真实数据的指针
type interfaceninit2er interface {
say() error
run(int,int) (int,error)
}
type Car struct {
price int
power float32
}
func (c Car) say() error {
fmt.Println("滴滴滴")
return errors.New("哒哒哒")
}
func (c Car) run(a int,b int) (int,error) {
return a + b,nil
}
func (c Car) walk() {
fmt.Println("i am walking")
}
type Ship struct {
price int
power float32
}
func (s Ship) say() error {
fmt.Println("滴滴滴")
return errors.New("哒哒哒")
}
func (s Ship) swim(a int,b int) (int,error) {
return a + b,nil
}
func interfaceninit3er() {
var inter interfaceninit2er
var car Car
var ship Ship
inter = car // 这里并不是等价的,即使 = 也不能 执行 inter.walk
inter.say() //实际执行了car 的say=, 上面是inter = car是让 inter有car的属性,也可以 inter = ship让他有ship的属性
inter.run(1,2)
ship.swim(2,3)
ship.say()
car.say()
car.run(2,3)
car.walk()
}
2.1 接口的赋值
//接口的赋值
type interfaceninit4er interface {
say() error
fly(int,int) (int,error)
}
type Bird struct {
price int
power float32
}
func (bi *Bird) say() error {
fmt.Println("滴滴滴")
return errors.New("哒哒哒")
}
func (bi *Bird) fly(a int,b int) (int,error) {
return a + b,nil
}
func foo(a interfaceninit4er) {
a.fly(1,2)
}
func interfaceninit5er() {
var bird Bird
var inter interfaceninit4er
inter = &bird //Bird的指针实现了interfaceninit4er接口,Bird没有实现//Bird实现了interfaceninit4er接口,则
//默认Bird的指针也实现了interfaceninit4er接口
inter.fly(1,2)
inter.say()
}
3.1 接口的嵌入
//interface 接口的嵌入
func interfaceninit6er() {
type Transporter interface {
whistle(int) int
}
type Steamer interface {
Transporter //接口嵌入。相当于Transporter接口定义的行为集合是Steamer的子集
displacement() int
}
}
###4.1 空接口
//空接口没有定义任何方法,因此任意类型都实现了空接口。空接口类型用interface{}表示,注意有{}。
type interfaceninit7er interface {
}
type A struct {
name string
}
func interfaceninit8er() {
var inter interfaceninit7er
a := A{}
inter = a
fmt.Println(inter)
//slice的元素、map的key和value都可以是空接口类型。map中的key可以是任意能够用==操作符比较的类型,不能是函数、map、切片,
//以及包含上述3中类型成员变量的的struct。map的value可以是任意类型。
//func square(x interface{}){} //该函数可以接收任意数据类型
var i int = 5
inter = i
fmt.Println(inter)
}
5.1 继承与重写
//继承
type Plane struct{
name string
}
type Brid struct{
Plane
}
func (b Brid) jcinit1() Brid{
//b就是Brid,继承了Plane的name
//b.Plane.name = "嘤嘤嘤",按理是应该这样写的,但是 Brid中没有name这个属性,可以直接写 b.name。它找不到name就会去找Plane的name
b.name = "嘿嘿嘿"
return b
}
//重写
type Niao struct {
age int
}
func (n Niao) cxinit1() int {
return 200
}
//重写父类Niao的fly方法
func (n Niao) cxinit2() int {
return n.cxinit1() + 100
}