【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.xdnf.cn/news/149249.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Win11 安装 Vim

安装包: 链接:https://pan.baidu.com/s/1Ru7HhTSotz9mteHug-Yhpw?pwd6666 提取码:6666 双击安装包,一直下一步。 配置环境变量: 先配置系统变量中的path: 接着配置用户变量: 在 cmd 中输入…

小谈设计模式(19)—备忘录模式

小谈设计模式(19)—备忘录模式 专栏介绍专栏地址专栏介绍 备忘录模式主要角色发起人(Originator)备忘录(Memento)管理者(Caretaker) 应用场景结构实现步骤Java程序实现首先&#xff…

基于Vue+ELement实现增删改查案例与表单验证(附源码)

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《ELement》。🎯🎯 &#x1…

打开MySQL数据库

在命令行里输入mysql --version就可以查看: mysql -uroot -p之前设置的密码(不用输入)就可登录成功:

karmada v1.7.0安装指导

前言 安装心得 经过多种方式操作,发现二进制方法安装太复杂,证书生成及其手工操作太多了,没有安装成功;helm方式的安装,v1.7.0的chart包执行安装会报错,手工修复了报错并修改了镜像地址,还是各…

Redis-数据过期策略

数据过期策略 惰性删除策略优点:对cpu比较友好,在用到该key的时候才去进行判断,对于很多用不到key不用浪费时间去检查是否过期缺点:对内存不友好,如果一个key过期了,但是我们又一直没有用到该key&#xff0…

竞赛选题 深度学习 opencv python 公式识别(图像识别 机器视觉)

文章目录 0 前言1 课题说明2 效果展示3 具体实现4 关键代码实现5 算法综合效果6 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于深度学习的数学公式识别算法实现 该项目较为新颖,适合作为竞赛课题方向,学…

1800_vim的宏录制功能尝试

全部学习信息汇总: GreyZhang/editors_skills: Summary for some common editor skills I used. (github.com) 最近5年多来,我emacs的编辑器用的还是比较多的。我的配置基本上是一个spacemacs,然后根据自己的需求增加了一丁点儿的其他配置。而…

数控车床中滚珠螺母的维护保养方法

滚珠螺母是一种高精度的机械部件,广泛应用于各种机械设备中,包括数控机床、精密轴承座、滚珠丝杆等,滚珠螺母作为数控机床中的进给系统的重要组件,其维护保养方法对于机床的精度和使用寿命具有重要影响。以下为数控机床滚珠螺母维…

李沐深度学习记录4:12.权重衰减/L2正则化

权重衰减从零开始实现 #高维线性回归 %matplotlib inline import torch from torch import nn from d2l import torch as d2l#整个流程是,1.生成标准数据集,包括训练数据和测试数据 # 2.定义线性模型训练 # 模型初始化(函…

基于Kylin的数据统计分析平台架构设计与实现

目录 1 前言 2 关键模块 2.1 数据仓库的搭建 2.2 ETL 2.3 Kylin数据分析系统 2.4 数据可视化系统 2.5 报表模块 3 最终成果 4 遇到问题 1 前言 这是在TP-LINK公司云平台部门做的一个项目,总体包括云上数据统计平台的架构设计和组件开发,在此只做…

1.2 数据模型

思维导图: 前言: **1.2.1 什么是模型** - **定义**:模型是对现实世界中某个对象特征的模拟和抽象。例如,一张地图、建筑设计沙盘或精致的航模飞机都可以视为具体的模型。 - **具体模型与现实生活**:具体模型可以很容…

2023/9/27 -- ARM

【汇编语言相关语法】 1.汇编语言的组成部分 1.伪操作:不参与程序的执行,但是用于告诉编译器程序该怎么编译 .text .global .end .if .else .endif .data2.汇编指令 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内…

【C++ 学习 ㉕】- 万字详解 unordered_map 和 unordered_set(哈希表的查找和容器的模拟实现)

目录 一、unordered_map 的基本介绍 二、unordered_set 的基本介绍 三、相关练习 3.1 - 在长度 2N 的数组中找出重复 N 次的元素 3.2 - 存在重复元素 3.3 - 两句话中的不常见单词 四、哈希表的查找 4.1 - 哈希表的基本概念 4.2 - 哈希函数的构造方法 4.3 - 处理冲突的…

UG\NX二次开发 获取所有子部件,封装两个函数

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 凉夜ronin 订阅本专栏,非常感谢。 简介 UG\NX二次开发 获取所有子部件,封装两个函数 效果 获取非抑制的所有子部件 //获取非抑制的所有子部件 vector<tag_t> GetChildPart(tag_t partOcc) {…

深度学习(3)---PyTorch中的张量

文章目录 一、张量简介与创建1.1 简介1.2 张量的创建 二、张量的操作2.1 张量的拼接与切分2.2 张量索引 三、张量的数学运算 一、张量简介与创建 1.1 简介 1. 张量是一个多维数组&#xff0c;它是标量、向量、矩阵的高维拓展。 2. 在张量的定义中&#xff0c;方括号用于表示张…

小谈设计模式(16)—抽象工厂模式

小谈设计模式&#xff08;16&#xff09;—抽象工厂模式 专栏介绍专栏地址专栏介绍 抽象工厂模式结构抽象工厂&#xff08;AbstractFactory&#xff09;具体工厂&#xff08;ConcreteFactory&#xff09;抽象产品&#xff08;AbstractProduct&#xff09;具体产品&#xff08;C…

MyBatisPlus(十)判空查询

说明 判空查询&#xff0c;对应SQL语句中的 IS NULL语句&#xff0c;查询对应字段为 NULL 的数据。 isNull /*** 查询用户列表&#xff0c; 查询条件&#xff1a;电子邮箱为 null 。*/Testvoid isNull() {LambdaQueryWrapper<User> wrapper new LambdaQueryWrapper<…

项目进展(三)-电机驱动起来了,发现了很多关键点,也遇到了一些低级错误,

一、前言 昨天电机没有驱动起来&#xff0c;头发掉一堆&#xff0c;不过今天&#xff0c;终于终于终于把电机驱动起来了&#xff01;&#xff01;&#xff01;&#xff01;&#xff0c;特别开心&#xff0c;哈哈哈哈&#xff0c;后续继续努力完善&#xff01;&#xff01;&…

Spring更简单的读取和存储对象

Spring更简单的读取和存储对象 经过前面的学习&#xff0c;我们已经可以实现基本的 Spring 读取和存储对象的操作了&#xff0c;但在操作的过程中我们发现读取和存储对象并没有想象中的那么“简单”&#xff0c;所以接下来我们要学习更加简单的操作 Bean 对象的方法。 在 Spri…