Golang 面向对象编程
1. 结构体
type Person struct {
name string
age int
}
person := Person{"mike",18}
fmt.Println(person)
用结构体类型表示Person,name
和age
是两个属性,还差方法。
在func后面增加了一个receiver(也就是method所依从的主体)。
func (person Person) showInfo() {
fmt.Printf("My name is %s , age is %d ",person.name,person.age)
}
func (person *Person) setAge(age int) {
person.age = age
}
person := Person{"mike",18}
person.showInfo()
person.setAge(20)
fmt,Println(person)
指针作为receiver
现在来看看SetAge这个method,它的receiver是一个指向Person的指针。想想为啥要使用指针而不是Person本身呢?
我们定义SetAge的真正目的是想改变这个Person的年龄,如果不传Person的指针,那么SetAge接受的其实是Person的一个
copy,也就是说method内对于年龄的修改,其实只作用于Person的copy,而不是真正的Person。所以我们需要传入指针。
这里可以把receiver当作method的第一个参数来看,然后结合前面函数讲解的传值和传引用就不难理解
2. 继 承
type Student struct {
Person
id int
score int
}
func (student *Student) showInfo() {
fmt.Println("I am a student ...")
}
func (student *Student) read() {
fmt.Println("read book ...")
}
student := Student{Person{"jake",16},1001,99}
student.showInfo()
student.setAge(22)
student.read()
Student结构体中,添加Person
作为匿名变量,这样Student继承自Person的属性和方法,还重写Person方法,类似与Java.
3. 多态
在golang中,多态的实现利用interface,
package main
import "fmt"
type Human interface {
speak(language string)
}
type Chinese struct {
}
type American struct {
}
func (ch Chinese) speak(language string ) {
fmt.Printf("speck %s\n",language)
}
func (am American ) speak(language string ) {
fmt.Printf("speck %s\n",language)
}
func main() {
var ch Human
var am Human
ch = Chinese{}
am = American{}
ch.speak("Chinese")
am.speak("English")
}
面向接口编程,结构体中只要有和接口中定义的同名方法,就称该结构体是实现了哪个接口。