golang中接口、继承
在面向对象编程中(OOP)接口定义对象的一系列行为,具体对象实现接口的行为。在golang中,接口就是一组方法签名,如果某个类型实现了该接口的全部方法,这个类型就实现了该接口,是该接口的实现。
在golang中接口定义示例如下:
type MyInterface interface {SayHello()GetAge() int
}
这样我们就定义了一个MyInterface类型的接口,如果我们想要实现这个接口,只要一个类型实现MyInterface的两个方法:SayHello、GetAge:
type Person struct {age intname string
}func (p Person)SayHello(){fmt.Println("hello ",p.name)
}func (p Person)GetAge() int{return p.age
}
这样Person类就实现了MyInterface接口,接下来可以按照如下方式使用:
var myInterFace MyInterfacemyInterFace = Person{age:20,name:"Leo"}myInterFace.SayHello()myInterFace.GetAge()
空接口
golang中的空接口,类似于java中的Object超级父类。golang中空皆苦没有任何方法,任意类型都是空接口的实现,空接口定义如下:
type EmptyInterface interface {}
这里EmptyInterface就是一个空接口,这时候,上面的Person也是该接口的实现:
var empty EmptyInterfaceempty = Person{age:20,name:"empty"}
接口对象类型转换
如果我们声明了一个接口类型,但是实际指向是一个对象,我们可以通过如下几种方式进行接口和对象类型的转换:
1.
if realType,ok := empty.(Person); ok{fmt.Println("type is Person ",realType)} else if realType,ok := empty.(Animal) ;ok{fmt.Println("type is Animal",realType)}
这种方式可以借助if else进行多个类型的判断
2.
switch realType2 := empty.(type) {case Person :fmt.Println("type is Person",realType2)case Animal :fmt.Println("type is Animal",realType2)}
继承
在golang中,采用匿名结构体字段来模拟继承关系。
type Person struct {name stringage intsex string
}
func (Person) SayHello(){fmt.Println("this is from Person")
}type Student struct {Personschool string
}func main() {stu := Student{school:"middle"}stu.name = "leo"stu.age = 30fmt.Print(stu.name)stu.SayHello()
}
这个时候,可以说Student是继承自Person.
需要注意的是,结构体嵌套时,可能存在相同的成员名,成员重名可能导致成员名冲突:
type A struct {a intb string
}
type B struct {a intb string
}type C struct {AB
}c := C{}c.A.a = 1c.A.b = "a"c.B.a = 2c.B.b = "b"// 这里会提示a名字冲突fmt.Println(c.a)
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
