【GO 编程语言】面向对象

指针与结构体


文章目录

  • 指针与结构体
  • 一、OOP 思想
  • 二、继承
  • 三、方法
  • 四、接口实现
  • 五、多态
  • 六、空接口
  • 七、接口继承
  • 八、接口断言
  • 九、Type别名


在这里插入图片描述


一、OOP 思想

Go语言不是面向对象的语言,这里只是通过一些方法来模拟面向对象,从而更好的来理解面向对象思想

  • 面向过程的思维模式
    • 1.面向过程的思维模式是简单的线性思维,思考问题首先陷入第一步做什么、第二步做什么的细节中,这种思维模式适合处埋简单的事情。
    • 2.面向对象的思维模式说白了就是分类思维模式。首先思考解决问题,需要哪些分类,然后对这些分类进行单独思考。最后,才对某个分类下的细节进行面向过程的思索。
  • 面向对象的三大特点:封装、继承、多态

二、继承

继承就是子类继承父类的特征和行为,使得子类具有父类的属性和方法,使得子类具有父类相同的行为。子类会具有父类的一般特性也会具有自身的特性。

Go 使用结构体嵌套实现继承

package mainimport "fmt"// 1、定义一个父“类”结构体
type Person struct {name stringage  int
}// 2、定义一个子“类”结构体
type Student struct {Person        // 匿名变量、继承school string // 子类自己的属性字段
}func main() {g1 := Person{name: "guan", age: 18}fmt.Println(g1.name)g2 := Student{Person{name: "guan0001", age: 22}, school: "NNU"}fmt.Println(g2.Person.name)fmt.Println(g2.name)// 提升字段// 对于Student来说,Person是匿名字段,Person中的属性 name、age就叫做提升字段// 提升字段可以通过名字直接访问不需要通过结构体名Personvar g3 Studentg3.name = "guan003"g3.school = "NNU"fmt.Println(g3)
}

三、方法

什么事方法

Go 语言中同时拥有函数和方法。

  • 方法:

    • 某个类别的行为功能,需要制定的接受者调用
    • 一段独立的功能代码,可以直接调用
  • 函数

    • 一段独立功能的代码,可以直接调用
    • 命名不能冲突
package main
import "fmt"
type Dog struct {name stringage  int
}
type Cat struct {name stringage  int
}// 方法定义
func (dog Dog) eat() {fmt.Println("Dog,eating")
}
func (dog Dog) sleep() {fmt.Println("Dog,sleeping")
}
func (cat Cat) eat() {fmt.Println("Cat,eating")
}
func main() {dog := Dog{name: "wangwangDog", age: 1}dog.eat()dog.sleep()cat := Cat{name: "miaomiaoCat", age: 2}cat.eat()}

在这里插入图片描述# 方法重写

  • 子类可以重写父类的方法 override
  • 子类可以新增自己的属性和方法
  • 子类可以直接访问父类的属性和方法
package mainimport ("fmt"
)type Animal struct {name stringage  int
}
type Dog struct {Animal
}
type Cat struct {Animalcolor string
}// 方法定义
func (animal Animal) eat() {fmt.Println(animal.name, "eating")
}
func (animal Animal) sleep() {fmt.Println(animal.name, "sleeping")
}
// 子类重写父类的方法
func (cat Cat) eat() {fmt.Println(cat.name, "eating")
}
// 子类拓展自己的方法
func (cat Cat) miao() {fmt.Println(cat.name, "miao")
}
func main() {dog := Dog{Animal{name: "wangwangDog", age: 1}}dog.eat()dog.sleep()cat := Cat{Animal{name: "miaomiaoCat", age: 2}, "red"}cat.eat()cat.miao()}

在这里插入图片描述

四、接口实现

Go语言提供了另外一种数据类型即接口,它把所有的具有共性的方法定义在一起,任何其他类型只要实现接口定义的全部方法就是实现了这个接口。

package mainimport "fmt"// USB 通过 interface 来声明定义一个接口
type USB interface {Input()Output()
}
type Mouse struct {name string
}// go 语言不需要像java通过implement显示的实现接口
// 实现接口中的方法,就算实现了接口
// go语言中,接口和实现类的关系,是非侵入式的
func (mouse Mouse) Input() {fmt.Println(mouse.name, "鼠标输入")
}
func (mouse Mouse) Output() {fmt.Println(mouse.name, "鼠标输出")
}func test(u USB) {u.Input()u.Output()
}func main() {// 通过传入接口实现类来进行具体方法的调用m := Mouse{name: "logi"}test(m)
}

在这里插入图片描述

五、多态

多态:一个事务拥有多种形态。是面向对象中很重要的一个特点。

Go 语言通过接口来模拟多态

package mainimport ("fmt"
)type Animal interface {eat()sleep()
}
type Dog struct {name string
}
type Cat struct {name string
}func (cat Cat) sleep() {//TODO implement mefmt.Println(cat.name, "sleeping")
}// 方法定义
func (dog Dog) eat() {fmt.Println(dog.name, "eating")
}
func (dog Dog) sleep() {fmt.Println(dog.name, "sleeping")
}func (cat Cat) eat() {fmt.Println(cat.name, "eating")
}func (cat Cat) miao() {fmt.Println(cat.name, "miao")
}func animalTest(a Animal) {fmt.Println("animalTest")a.eat()a.sleep()
}
func main() {dog := Dog{name: "旺财"}dog.eat()dog.sleep()cat := Cat{name: "喵喵"}cat.eat()cat.sleep()cat.miao()// animalanimalTest(dog)animalTest(cat)// 定义一个类型为接口类型的变量// 实际上可以赋值为任意实现类的对象var animal Animalanimal = dogfmt.Println(animal)animal = catfmt.Println(cat)
}

在这里插入图片描述

六、空接口

package mainimport ("fmt"
)// 空接口
type Animal interface {
}
type Dog struct {name string
}
type Cat struct {name string
}func (cat Cat) sleep() {//TODO implement mefmt.Println(cat.name, "sleeping")
}// 方法定义
func (dog Dog) eat() {fmt.Println(dog.name, "eating")
}
func (dog Dog) sleep() {fmt.Println(dog.name, "sleeping")
}func (cat Cat) eat() {fmt.Println(cat.name, "eating")
}func (cat Cat) miao() {fmt.Println(cat.name, "miao")
}func test(a Animal) {fmt.Println(a)
}// fmt 下的输出接受的参数都是这样的
func test1(a Animal) {fmt.Println(a)
}func main() {var animal1 Animal = Dog{name: "旺财"}fmt.Println(animal1)var animal2 Animal = Cat{name: "喵喵"}fmt.Println(animal2)var animal3 Animal = "hello"fmt.Println(animal3)var animal4 Animal = 666fmt.Println(animal4)fmt.Println("--------------------------")test(animal1)test(animal2)test(animal3)test(animal4)fmt.Println("--------------------------")test1(animal1)test1(animal2)test1(animal3)test1(animal4)// map key string value objmap1 := make(map[string]interface{})map1["name"] = "guan12319"map1["age"] = 18map1["dog"] = Dog{name: "土狗"}fmt.Println("--------------------------")// 切片s1 := make([]interface{}, 0, 10)s1 = append(s1, animal1, animal2, animal3, animal4, 666, 888)fmt.Println(s1)fmt.Println(map1)
}

在这里插入图片描述

七、接口继承

package mainimport "fmt"// 接口继承
type A interface {test01()
}type B interface {test02()
}type C interface {ABtest03()
}type Dog struct {
}func (dog Dog) test01() {fmt.Println("test01")
}
func (dog Dog) test02() {fmt.Println("test02")
}
func (dog Dog) test03() {fmt.Println("test03")
}func main() {var dog Dog = Dog{}dog.test01()dog.test02()dog.test03()// 在接口嵌套中,嵌套的接口默认继承了被嵌套接口的所有方法var testA A = dogtestA.test01()var testB B = dogtestB.test02()var testC C = dogtestC.test01()testC.test02()testC.test03()
}

在这里插入图片描述

八、接口断言

package mainimport "fmt"// 接口断言
func assertString(i interface{}) {s := i.(string)fmt.Println(s)
}
func assertInt(i interface{}) {s, ok := i.(int)if ok {fmt.Println("接口变量i是int类型,i=", s)} else {fmt.Println("接口变量i不是int类型")}}type T interface {
}func test(i interface{}) {switch i.(type) {// 如果断言的类型,同时实现了Switch断言的多个case,取第一个casecase string:fmt.Println("string类型")case int:fmt.Println("int类型")case T:fmt.Println("T类型")case nil:fmt.Println("nil类型")default:fmt.Println("未知类型")}
}
func main() {assertString("test")assertInt(666)a := "hello"b := 888c := truevar i Ttest(a)test(b)test(c)test(i)
}

在这里插入图片描述

九、Type别名

package mainimport "fmt"// 通过type 关键字的定义,DiyInt就是一种新的类型,它具有int的特性
type Diyint intfunc main() {var a Diyint = 88var b int = 66c := int(a) + bfmt.Println(c)// myint类型只会在代码中存在,编译完成时并不会有myint类型type myint = intvar d myint = 66var e int = 99f := d + efmt.Println(f)
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/126117.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么,这年头还有人不知道404

写在前面 哥,来帮我看看,这个请求怎么404了,明明接口路径是对的啊!一个下午,组里的小哥突然让我帮忙看这个问题,我不禁一惊,啥,这年头了还有人搞不定404,如有还有&#…

国庆中秋宅家自省: Python在Excel中绘图尝鲜

Python3中类的高级语法及实战 Python3(基础|高级)语法实战(|多线程|多进程|线程池|进程池技术)|多线程安全问题解决方案 Python3数据科学包系列(一):数据分析实战 Python3数据科学包系列(二):数据分析实战 Python3数据科学包系列(三):数据分析实战 【一】国庆中秋: 悟 【国…

[React源码解析] React的设计理念和源码架构 (一)

任务分割异步执行让出执法权 文章目录 1.React的设计理念1.1 Fiber1.2 Scheduler1.3 Lane1.4 代数效应 2.React的源码架构2.1 大概图示2.2 jsx2.3 Fiber双缓存2.4 scheduler2.5 Lane模型2.6 reconciler2.7 renderer2.8 concurrent 3.React源码调试 1.React的设计理念 Fiber: 即…

SpringMVC+统一表现层返回值+异常处理器

一、统一表现层返回值 根据我们不同的处理方法,返回的数据格式都会不同,例如添加只返回true|false,删除同理,而查询却返回数据。 Result类 为此我们封装一个result类来用于表现层的返回。 public class Result {//描述统一格式…

【二】spring boot-设计思想

spring boot-设计思想 简介:现在越来越多的人开始分析spring boot源码,拿到项目之后就有点无从下手了,这里介绍一下springboot源码的项目结构 一、项目结构 从上图可以看到,源码分为两个模块: spring-boot-project&a…

【程序员必看】计算机网络,快速了解网络层次、常用协议和物理设备!

文章目录 0 引言1 基础知识的定义1.1 计算机网络层次1.2 网络供应商 ISP1.3 猫、路由器、交换机1.4 IP协议1.5 TCP、UDP协议1.6 HTTP、HTTPS、FTP协议1.7 Web、Web浏览器、Web服务器1.8 以太网和WLAN1.9 Socket (网络套接字) 2 总结 0 引言 在学习的过程…

【Go语言实战】(25) 分布式算法 MapReduce

MapReduce 写在前面 身为大数据专业的学生,其实大学我也多多少少接触过mapreduce,但是当时觉得这玩意太老了,觉得这和php一样会被时代淘汰。只能说当时确实太年轻了,没有好好珍惜那时候的学习资源… 现在回过头来看mapreduce&a…

如何选择合适的自动化测试工具?

自动化测试是高质量软件交付领域中最重要的实践之一。在今天的敏捷开发方法中,几乎任一软件开发过程都需要在开发阶段的某个时候进行自动化测试,以加速回归测试的工作。自动化测试工具可以帮助测试人员以及整个团队专注于自动化工具无法处理的各自任务&a…

练[watevrCTF-2019]Cookie Store

[watevrCTF-2019]Cookie Store 文章目录 [watevrCTF-2019]Cookie Store掌握知识解题思路关键paylaod 掌握知识 ​ 抓包放包,set-cookie和cookie的联系,base64编码,cookie请求头 解题思路 打开题目链接,发现响应速度有点慢。发现…

【AI视野·今日Robot 机器人论文速览 第四十九期】Fri, 6 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Fri, 6 Oct 2023 Totally 29 papers 👉上期速览✈更多精彩请移步主页 Interesting: 📚ContactGen, 基于生成模型的抓取手势生成,类人五指手。(from 伊利诺伊大学 香槟) 数据集:GRAB da…

使用Visual Studio调试排查Windows系统程序audiodg.exe频繁弹出报错

VC常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...&a…

分享一款yyds!电子期刊制作网站

大家好,今天要跟大家分享一个超级赞的资源!有没有曾经你苦苦寻找的那一款适合自己的电子期刊制作网站呢?下面就让我来给大家详细介绍一个非常棒的网站,有了它,你可以轻松制作出专业、精美的电子期刊! 1.打开…