一、封装
go语言中并没有像C++,Java语言中这类的Class,它只含有像C语言中的结构体,用结构体和指针等特性,完成一个类的作用,很巧妙的使用了指针和结构体,不仅是go的面向对象,包括go语言中的map等操作都是借助了结构体。其实,说白了,C++、Java等面向对象的语言中,类的底层实现就是结构体,对象的引用就是指针,只是语言把他们封装起来了而已。然而这使得很多人刚接触面向对象的时候很不理解这些东西。
1、结构体
golang中的结构体就是java中的类。
type student struct{
name string//字段
age int
}
2、实例化
类名{字段key-value逗号隔开}
或
类名{value逗号隔开}
一定要注意:定义结构体时用分号(默认可不加),实例化时用逗号
student{"张三",18,}
3、构造函数
与Java默认提供一个和类名相同名字的构造函数不同,go要自己定义并命名构造函数。
func newStu(name string,age int,stuId int,college *string) *student{
s := &student{
name,
age,
}
return s
}
4、成员方法
配合接收体实现。
函数除了函数名、参数、返回值,还有接收器的概念,接收器只能有一个,接收器的概念类似于面向对象概念中的this或self,传入的接收器对象(一般要加星以便可对其修改),在函数中可以对其进行修改。
go语言方法和接收器
go函数声明语法:函数名前的括号内的东西
func (接收器)函数名(参数)(返回值){
函数体
}
示例:
/*学生类成员方法*/
func(stu *student)selfIntro(){
fmt.Println("My name is",stu.name)
}
go把成员方法称为方法,解释为:带接受体的函数。可见方法也是函数,一种特殊函数,但不带接受提的函数不可称为方法。
二、继承
子类中写一个父类。
示例:
type middleSchoolStudent{
score int
student//继承student类
}
三、多态
如果一个类实现了某个接口的方法,就可以说该类实现了该接口。不需要implements关键字。
type human interface{//定义human接口
selfIntro()//接口中的方法:只有形参、返回值
}
var _ human =&student{} //断言student类实现了human接口。不是必须。
//_ 下划线是占位符,说明这个变量接下来不使用。
//父类引用指向子类对象:多态的体现。
//因为是引用类型,所以&符号是必须的。