(1)Go语言中没有类概念
Go语言没有类,结构体提供了绑定数据和方法的行为,可借助结构体解决面向对象的多态的问题。
(2)Go语言中函数和方法是不同的概念
个人理解,函数是具有独立功能的代码块,方法是对象行为的代码块,方法的本质是函数。在Go语言中两者最明显的区别是方法有接受者,函数无接收者。
(3) Go语言中空接口
Go语言接口是一组方法签名。空接口是指没有定义任何方法的接口,任何类型的数据都可以实现空接口,且它的内部实现了保存对象的类型和指针,因此它能够灵活保存抽象数据。Go语言中空接口很常用。
(4)duck typing
Go属于duck typing类型语言,即”动态类型语言“或者”解释型语言“,类似于python、Javascript、Ruby语言。
obj_method.go
package mainimport ("fmt"
)// 定义结构体
type Person struct {name, sex string
}/*
// 方法定义,官方建议使用“接收者类型”的首字母的小写作为“接收者变量”的名字
// 如果返回值参数列表没有返回值,或者只有一个返回值,可以不要括号“()”
func (接收者变量, 接收者类型) 方法名称(输入参数列表) (返回值参数列表){
}// 函数定义
func 方法名称(输入参数列表) (返回值参数列表){
}
*/// 方法
func (p Person) eating(food string) string {fmt.Println("方法内:", p.name+" is eating "+food)return "Beautiful " + food
}// 主入口
func main() {person := Person{"Mason", "male"}msg := person.eating("Apple")fmt.Println("返回值:", msg)
}
执行obj_method.go
# go run obj_method.go
方法内: Mason is eating Apple
返回值: Beautiful Apple
obj_inherit.go
package mainimport "fmt"type Person struct {name stringsex string
}// 方法
func (p Person) eating(food string) string {fmt.Println("方法内:", p.name+" is eating "+food)return "Beautiful " + food
}// 方法继承,使用定义了方法的匿名字段即可实现继承
type Teacher struct {// 继承Person,Person没有属性名称是匿名字段Person// 老师教的科目subject string
}// 方法继承
type Student struct {// 继承PersonPerson// 学生作业work string
}func main() {// 实现类teacher := Teacher{Person{"Teacher", "male"}, "Chinese"}student := Student{Person{"Student", "male"}, "Learn Chinese"}// 调用方法teacher.eating("Apple")student.eating("Banana")}
执行obj_inherit.go
# go run obj_inherit.go
方法内: Teacher is eating Apple
方法内: Student is eating Banana
obj_interface.go
package mainimport "fmt"// 接口是一组方法的集合
/*
// 接口定义,如果返回值参数列表没有返回值,或者只有一个返回值,可以不要括号“()”
type 接口名称 interface {方法1(输入参数列表1) (返回值参数列表1)方法2(输入参数列表2) (返回值参数列表2)……方法N(输入参数列表N) (返回值参数列表N)
}// 接口实现,如果返回值参数列表没有返回值,或者只有一个返回值,可以不要括号“()”
func (接收者变量, 接收者类型) 方法1(输入参数列表1) (返回值参数列表1){}
func (接收者变量, 接收者类型) 方法2(输入参数列表2) (返回值参数列表2){}
……
func (接收者变量, 接收者类型) 方法N(输入参数列表N) (返回值参数列表N){}*/// 定义接口
type Person interface {eating(food string) string
}// 定义结构体
type Teacher struct {name string
}type Student struct {name string
}// 使用Teacher结构体实现方法
func (t Teacher) eating(food string) string {fmt.Println("The " + t.name + " eating " + food)return "Good teacher"
}// 使用Student结构体实现方法
func (s Student) eating(food string) string {fmt.Println("The " + s.name + " eating " + food)return "Good student"
}func main() {var person Personteacher := Teacher{"Teacher"}student := Student{"Student"}// 实现多态person = teacherperson.eating("Apple")person = studentperson.eating("Banana")}
执行obj_interface.go
# go run obj_interface.go
The Teacher eating Apple
The Student eating Banana
下一篇:PMP第九章重要知识点