当前位置:首页 » 《我的小黑屋》 » 正文

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

6 人参与  2024年04月26日 09:15  分类 : 《我的小黑屋》  评论

点击全文阅读


?博主CSDN主页:杭电码农-NEO?

⏩专栏分类:Go语言专栏⏪

?代码仓库:NEO的学习日记?

?关注我?带你学习更多Go语言知识
  ??


在这里插入图片描述

GO快速上手

1. 前言2. 初识GO中的结构体3. 结构体的方法的引入4. GO中的封装与继承5. GO语言中的接口与多态6. 总结以及拓展

1. 前言

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

本章重点:

本篇文章会讲解GO中的结构体是如何定义并且使用的,并且会讲解结构体的方法与普通的函数有什么区别.再会讲解GO中的继承是如何实现的.最后会引入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 Teachert1.Name = "neo_kou"t1.Age = 21t1.ID = 1001fmt.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 = 18t3.ID = 1006var t4 Teacher = Teacher{Name : "张三"Age : 40ID : 1007}fmt.Println(t2)fmt.Println(t3)}

注意,GO语言中的结构体指针类型变量,在访问结构体中的成员变量时,可以直接使用点.不用使用箭头->.并且结构体是用户单独定义的类型,和其他类型进行转换时需要有完全相同的字段(名字,个数和类型).GO语言中的type相当于取别名,取的别名GO语言认为它是一种新的数据类型


3. 结构体的方法的引入

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

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

上面的代码中,test就是结构体方法,第一个括号内容: (a A),证明这个方法绑定的是结构体A,只有结构体A变量才能访问这个方法,并且这个代码中的方法是结构体对象的值传递,所以方法内修改是不会影响外面的变量的.除此之外,如果一个类型实现了String()这个方法,那么fmt.Println默认会调用这个变量的String()进行输出

方法和函数的区别:

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

4. GO中的封装与继承

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

在这里插入图片描述
话不多说,直接举个例子:

type Person struct{Nation stringAge intWeight int}type Chinese struct{Sex stringhometown stringPerson//复用父类,加入匿名结构体}type American struct{enterprise stringPerson}func (p Person) ShowInfo(){fmt.Println(p.Age,p,Sex)}func main(){c := Chinese{}c.Age = 18c.Sex = "男"c.Person.ShowInfo()}

请注意,这里变量c是Chinese类型,它访问父类Person类中的变量或方法时,可以直接用.访问到,而不是使用c.Person.Age的方式,GO语言在这一块做了简化.并且不建议将父类和子类的变量重名. GO语言支持多继承,一个结构体嵌套多个匿名结构体
在这里插入图片描述


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

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

type Person struct{Nation stringAge intWeight int}type Chinese struct{Sex stringhometown stringPerson//复用父类,加入匿名结构体}type American struct{enterprise stringPerson}上面在定义基本的结构体/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接口的能力的变量

接口的注意事项:

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

走到这儿,细心的同学可能就发现了,接口SayHello中定义了函数sayHello,并且这个函数只能被Chinese或American对象调用,也就是说当我们在main函数中调用greet函数去执行sayHello函数时,若你是Chinese类型变量,那么就会打印"你好",如果是American类型变量就会打印"hi~".这上面的过程不就是多态吗?接口接收的是什么类型,那么就会调用什么类型的方法,这其实就是多态.GO语言中的多态其实就是用接口实现的!


6. 总结以及拓展

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


? 下期预告:文件操作和管道 ?

点击全文阅读


本文链接:http://zhangshiyu.com/post/100321.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1