【Go】四、面向对象

这篇具有很好参考价值的文章主要介绍了【Go】四、面向对象。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

面向对象

1、匿名字段

​        go只提供类型而不写字段名的方式,也就是匿名字段,也称为嵌入字段

1、不写字段名,只给出类型

2、嵌套结构中,包含相同字段名,逐级加入

2、接口

​        接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节 => 是一种类型,抽象类型,interface是一组method的集合,接口做的事情就像是定义了一个协议,不关心属性(数据),只关心行为(方法)

1、为什么要使用接口?

​        比如猫会叫(喵喵喵)、狗会叫(汪汪汪),这个时候如果不断的有新的动物加入,由于我们它们实现的方法是很类似的,可以尝试抽象方法,让他们去调用该抽象方法,实现具体的操作。

2、接口的定义

1、接口是一个或多个方法签名的集合
2、任何类型方法集中`只要拥有该接口‘对应的全部方法’签名,就表示’实现‘了该接口,无需在类型上显式声明实现了那个接口,称为Structural Typing`
3、所谓对应方法,是指有相同名称、参数列表(不包括参数名)以及返回值

4、接口只有声明方法、没有实现、没有数据
5、接口可以匿名嵌入其他接口,或嵌入到结构总
6、接口名习惯义er结尾
type 接口类型名 interface {
  方法1(参数列表1)返回值列表1
  方法2(参数列表1)返回值列表2
  方法3(参数列表1)返回值列表3
}

// 解释:当方法名和接口名大写的时候,表示这个方法可以被接口所在包之外的代码访问

3、实现接口的条件

​        一个对象只要全部实现接口中的方法,那么就实现了这个接口,换句话说,接口就是一个需要实现的方法列表。

4、接口实现过程

​        1)定义接口;2)定义多个结构;3)对应的结构类型充当方法的接受者,实现接口中的方法

5、接口类型变量

​        我们可以通过接口类型.方法(参数列表),来实现接口中的方法,具有良好的代码可读性。

// 接口类型变量:存储所有实现该接口的实例,Sayer类型的变量能够存储dog和cat类型的变量
func main() {
  var x Sayer 	// 声明一个Sayer类型的变量x
  a := cat{}	  // 实例化一个cat
  b := dog{} 		// 实例化一个dog
  x = a					// 将cat实例赋值给x
  x.say() 			// say()方法 喵喵喵
  x = b					// 将dog实例赋值给x
  x.say() 			// say()方法,汪汪汪
}

6、值接收者和指针接收者实现接口的区别

1、值接收者实现接口

func (d dog) move() {
    fmt.Println("狗会动")
}  
func main() {
    var x Mover
    var wangcai = dog{} // 旺财是dog类型
    x = wangcai         // x可以接收dog类型
    var fugui = &dog{}  // 富贵是*dog类型
    x = fugui           // x可以接收*dog类型
    x.move()
} 

// 解释:不管dog结构体还是结构体指针*dog类型的变量都可以赋值给该接口变量,因为Go语言中有对指针类型变量求值的语法糖,dog指针fugui会自动求值*fugui

2、指针接收者实现接口
func (d *dog) move() {
    fmt.Println("狗会动")
}
func main() {
    var x Mover
    var wangcai = dog{} // 旺财是dog类型
    x = wangcai         // x不可以接收dog类型
    var fugui = &dog{}  // 富贵是*dog类型
    x = fugui           // x可以接收*dog类型
}

// 解释:Mover接口实现的是*dog类型,所以不能给x传入dog类型的wangcai,此时x只能存储*dog类型的值(fugui)

2.1、类型与接口的关系

1、一个类型实现多个接口(狗可以叫、运动),多个接口间彼此独立,不知道对方的存在

// Sayer接口
type Sayer interface {
  sayer()
}

// Mover接口
type Mover interface {
  move()
}

// => dog既可以实现Sayer接口,也可以实现Mover接口
type dog struct {
	name string
}

// 实现Sayer接口
func (d dog) say() {
  fmt.Printf("%s会叫汪汪汪\n", d.name)
}

// 实现Mover接口
func (d dog) move() {
  fmt.Printf("%s会动\n", d.name)
}

func main() {
  var x Sayer
  var y Mover
  
  var a = dog{name : "wangcai"}
  x = a
  y = a
  x.say()
  y.move()
}

// 结果
wangcai会叫汪汪汪
wangcai会动

2、多个类型实现一个接口(车可以动、人也可以动)

3、接口嵌套(say接口和move接口,嵌套到animal接口中)

2.2、空接口

​ 接口没有定义任何接口,任何类型都实现了空接口,空接口的变量可以存储任意类型的变量。

1、空接口的应用

​        1)作为函数的参数

​        2)作为map的值文章来源地址https://www.toymoban.com/news/detail-422130.html

2.3、类型断言(todo)

到了这里,关于【Go】四、面向对象的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go语言面向对象编程

    注:安装教程 上一篇 1.1、简单实例 1.2、指针 1、Go语言中的面向对象最为直观,也无需支付额外的成本。如果要求对象必须以指针传递,这有时会是个额外成本,因为对象有时很小(比如4字节),用指针传递并不划算。 只有在你需要修改对象的时候,才必须用指针。它不是

    2024年02月06日
    浏览(56)
  • 【Go】四、面向对象

    ​        go只提供 类型而不写字段名的方式 ,也就是匿名字段,也称为嵌入字段 1、不写字段名,只给出类型 2、嵌套结构中,包含相同字段名,逐级加入 ​        接口(interface)定义了一个对象的行为规范,只定义规范不实现,由具体的对象来实现规范的细节

    2023年04月23日
    浏览(21)
  • go语言(十一)----面向对象继承

    一、面向对象继承 写一个父类 子类继承 父类 子类的新方法 定义子类 两种方法: 第一种: 第二种: 子类继承父类的使用

    2024年01月22日
    浏览(39)
  • go语言(十)---- 面向对象封装

    面向对象的封装 可以看出修改后,li4,数据并没有变化 如果加入指针,进行li4的修改后,数据会发生变化 如果首字母大写,表示其他包也能够访问 如果类的属性首字母大写,表示该属性对外是能够访问的,否则的话,只能类的内部访问。

    2024年01月20日
    浏览(42)
  • 【Go 基础篇】走进Go语言的面向对象编程世界

    欢迎各位编程爱好者们!今天我们将进入Go语言的面向对象编程(OOP)世界,一窥这门语言如何运用OOP思想来组织和构建程序。无论你是初学者还是有一些经验的开发者,本文都将为你揭示Go语言中的OOP特性、方法和最佳实践。 面向对象编程是一种程序设计范式,它以对象为

    2024年02月10日
    浏览(54)
  • Golang之路---03 面向对象——类型断言

    作用 检查 i 是否为 nil 检查 i 存储的值是否为某个类型 使用方式 第一种: 这个表达式可以 断言一个接口对象(i)里不是 nil,并且接口对象(i)存储的值的类型是 T ,如果断言成功,就会返回值给 t,如果断言失败,就会触发 panic。(即nil或者接口对象类型不为T时均会触发

    2024年02月14日
    浏览(42)
  • 【python】面向对象(类型定义&魔法方法)

    目录 一、引言 二、类型定义 1、什么是类型的定义? 2、案例 三、魔法方法 1、什么是魔法方法 2、基础部分 3、比较操作 4、容器类型 5、属性管理 6、封装 7、方法拓展 8、继承 9、多态         Python是一种面向对象的语言,它支持类( class )和对象( object )的概念。面

    2024年02月05日
    浏览(38)
  • Python-面向对象:面向对象、成员方法 、类和对象、构造方法、魔术方法、封装、继承、类型注解、多态(抽象类(接口))

    当前版本号[20230806]。 版本 修改说明 20230806 初版 生活中数据的组织 学校开学,要求学生填写自己的基础信息,一人发一张白纸,让学生自己填, 易出现内容混乱 但当改为登记表,打印出来让学生自行填写, 就会整洁明了 程序中数据的组织 在程序中简单使用变量来记录学

    2024年02月14日
    浏览(52)
  • 5 map、结构体、方法、面向对象【Go语言教程】

    1.1 概念及声明 ①概念 基本语法:var map 变量名 map[keytype]valuetype key 可以是什么类型? golang 中的 map,的 key 可以是很多种类型,比如 bool, 数字,string, 指针, channel , 还可以是只包含前面几个类型的 接口, 结构体, 数组 通常 key 为 int 、string 注意: slice, map 还有 function 不可以,

    2024年02月02日
    浏览(52)
  • 【Go语言快速上手(四)】面向对象的三大特性引入

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Go语言专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 GO语言也支持面向对象编程,但是和传统的面向对象语言(如CPP)有明显的区别,GO并不是纯粹的面对对象编程语言.所以说GO是支持面向对

    2024年04月26日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包