持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
go语言相对来讲不是一门绝对的面向对象的语言,没有像java那样,所有操作都是类操作的堆堆砌,没有类似于class 的设计,与之类似的在go 中的内容是struct
,struct 的存在可以类似的帮助我们实现一些面向对象的操作,比如说继承和多肽。
继承
我们定义两个结构体,一个Person ,一个Student, Student 继承Person 的特征并且拥有一些自己的属性和方法。我们一般使用go 的特性struct 结构体可以嵌套特性来实现这一功能。
这里使用了两种继承方式,一种是 student1
、一种是student2
,这两种方式在调用父类的方式有些许差别,不过我们经常使用的方式是 student1
。
-
方式1 (常用) 用了一些小技巧,在go 里边儿,可以直接使用 变量类型作为值的名称
-
方式2 (普通方式,当写继承结构时候我们不太常用这种结构)
type Person struct {
name string
age int
}
// 方式1
type Student1 struct {
Person
class string
grade int
}
// 方式2
type Student2 struct {
person Person
class string
grade int
}
func (this Person) sleep() {
fmt.Printf("start sleep ··zzzzzz")
}
func (this Student1) sleep() {
fmt.Printf("i am a student , i can sleep ")
}
func (this Student1) exam1() {
fmt.Printf("i am student1, start exam ````")
}
func (this Student2) exam2() {
fmt.Printf("i am student2 , start exam")
}
调用
很明显方式1 调用结构更加简单
func main() {
p := Person{
name: "xiaoming",
age: 19,
}
user1 := Student1{
Person: p,
class: "二年级(一班)",
grade: 99,
}
user2 := Student2{
person: p,
class: "高三(二班)",
grade: 150,
}
// 方法重载
// 调用“子类”sleep
user1.sleep()
//调用 “父类” sleep
user1.Person.sleep()
// 方式1
fmt.Println(user1.name,user1.age,user1.class,user1.grade)
//方式2
fmt.Println(user2.person.name,user2.person.age,user2.class,user2.grade)
}
多态
go 的多态是通过接口来实现的,go 语言实现接口不和java 一样,不需要显示的声明实现了哪个接口,这样更好的实现了程序之间的解耦,从而使代码更加简洁。
type sleep interface {
sleep()
}
type Person struct {
name string
age int
}
// 方式1
type Student1 struct {
Person
class string
grade int
}
// 方式2
type Student2 struct {
person Person
class string
grade int
}
func (this Person) sleep() {
fmt.Printf("start sleep ··zzzzzz")
}
func (this Student1) sleep() {
fmt.Printf("i am a student , i can sleep ")
}
// sleep 接口
func tosleep(user sleep) {
user.sleep()
}
func main() {
p := Person{
name: "xiaoming",
age: 19,
}
user1 := Student1{
Person: p,
class: "二年级(一班)",
grade: 99,
}
user2 := Student2{
person: p,
class: "高三(二班)",
grade: 150,
}
tosleep(user1)
tosleep(p)
}