【Go语言快速上手(四)】面向对象的三大特性引入-LMLPHP

1. 前言

GO语言也支持面向对象编程,但是和传统的面向对象语言(如CPP)有明显的区别,GO并不是纯粹的面对对象编程语言.所以说GO是支持面向对象编程特性的,这样说比较合理


2. 初识GO中的结构体

GO语言中没有class类,只有struct结构体,GO中的struct和其他语言中的class有着同等的地位.GO语言的面向对象非常简洁,没有复杂的重载,构造函数,以及析构函数,更没有什么隐藏的this指针.

type Teacher struct{
	Name string//姓名,string类型
	Age int//年龄,int类型
	ID int //学号,int类型
}
func main(){
	var t1 Teacher
	t1.Name = "neo_kou"
	t1.Age = 21
	t1.ID = 1001
	fmt.Println(t1)
}

GO的结构体变量支持多种定义方式:

type Teacher struct{
	Name string//姓名,string类型
	Age int//年龄,int类型
	ID int //学号,int类型
}
func main(){
	var t2 Teacher = Teacher{"小明",25,1005)
	var t3 *Teacher = New(Teacher)
	t3.Name = "小红"
	t3.Age = 18
	t3.ID = 1006
	var t4 Teacher = Teacher{
		Name : "张三"
		Age : 40
		ID : 1007
	}
	fmt.Println(t2)
	fmt.Println(t3)
}

3. 结构体的方法的引入

GO语言中的方法是作用在指定的数据类型上的.和指定的数据类型进行绑定,因此自定义类型都可以有方法(不仅仅是struct可以有),方法的声明和调用格式:

type A struct{
	Age int
}
func (a A) test(){
	fmt.Println(a.Age)
}
func main(){
	var tmp A
	tmp.Age = 18
	tmp.test()
}

方法和函数的区别:

  1. 方法需要绑定指定的类型,而函数不需要
  2. 方法的调用为:变量.方法名(参数),而函数的调用是:函数名(参数)
  3. 对于函数来说,参数是什么类型就应该传入什么类型,但对方法来说,形参为值类型,也可以传递指针,形参为指针类型也可以传递值

4. GO中的封装与继承

这里就不多阐述封装和继承的概念了.GO语言中通过将结构体,以及结构体中的字段的首字母小写,这样一来其他包就不能使用(类似于private),然后在结构体所在的包提供一个大写的函数(set方法)用于操作结构体内的变量.再提供一个大写的Get方法,用于返回结构体中的数据

【Go语言快速上手(四)】面向对象的三大特性引入-LMLPHP

type Person struct{
	Nation string
	Age int
	Weight int
}
type Chinese struct{
	Sex string
	hometown string
	Person//复用父类,加入匿名结构体
}
type American struct{
	enterprise string
	Person
}

func (p Person) ShowInfo(){
	fmt.Println(p.Age,p,Sex)
}
func main(){
	c := Chinese{}
	c.Age = 18
	c.Sex = "男"
	c.Person.ShowInfo()
}

5. GO语言中的接口与多态

接口的存在是为了定义规则,规范或某种具体的功能,它需要使用interface关键字.话不多说,直接上demo代码

type Person struct{
	Nation string
	Age int
	Weight int
}
type Chinese struct{
	Sex string
	hometown string
	Person//复用父类,加入匿名结构体
}
type American struct{
	enterprise string
	Person
}
上面在定义基本的结构体/
type SayHello interface{
	//声明一个没有实现的方法
	sayHello()
}
//实现具体的方法
func (p Chinese) sayHello(){
	fmt.Println("你好")
}
//实现具体的方法
func (p American) sayHello(){
	fmt.Println("hi~")
}
func greet(s SayHello){
	s.sayHello()
}

func main(){
	c := Chinese{}
	a := American{}
	greet(a)
	greet(c)
}

定义一个函数,专门用于和各国人打招呼的函数,接收具备sayHello接口的能力的变量

  1. 接口中可以定义一组方法,但不需要实现,并且接口中不能包含任何变量
  2. 接口本身不能创建实例,但可以指向一个实现了该接口的自定义类型的变量
  3. 只要是自定义数据类型都可以实现接口,不仅仅是结构体变量
  4. 一个自定义类型可以实现多个接口
  5. 空接口没有如何方法,所以可以理解为所有类型都实现了空接口,也就是说可以将任意一个变量赋给空接口

6. 总结以及拓展

想当年我写C++的继承和多态时,至少写了4篇文章才把它讲清楚啊,GO语言的继承和多态就简单多了,没有那么多坑,也没有那么多花里胡哨的东西,真是简洁啊.还是内句话,本系统文章只将用法,保证你能看懂GO语言代码,并且能自己产出代码.然而原理以及实现细节我们都不谈


04-25 19:16