当前位置: 首页 > article >正文

【Go】四、面向对象

文章目录

  • 面向对象
    • 1、匿名字段
    • 2、接口
      • 2.1、类型与接口的关系
      • 2.2、空接口
      • 2.3、类型断言(todo)

面向对象

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的值

2.3、类型断言(todo)


http://www.kler.cn/a/14363.html

相关文章:

  • ROS学习第二十六节——机器人仿真相关组件
  • OSCP-Slort(远程文件包含、windows定时任务提权)
  • 【c语言】带你快速理解函数的传值和传址
  • 代码随想录算法训练营第五十五天|392.判断子序列、115.不同的子序列
  • itop-3568 开发板系统编程学习笔记(18)LED 应用编程
  • qiankun 框架是怎么做的样式隔离
  • SpringBoot配置文件
  • Ingonyama团队的ZKP加速
  • docker常用命令
  • servlet技术
  • 云原生|kubernetes|rancher-2.6.4安装部署简明手册
  • Oracle的学习心得和知识总结(二十二)|Oracle数据库Real Application Testing之Database Replay实操(二)
  • redis学习笔记
  • Rust之泛型、特性和生命期(一):基本概念
  • 记录自己第一次项目管理(附件:WBS计划与会议纪要模板)
  • 操作系统原理 —— 进程有哪几种状态?状态之间如何切换?(七)
  • 【iOS】—— 响应者链和事件传递链
  • 我实现了一个乞丐版的评论功能
  • C语言函数大全-- q 开头的函数
  • 搞懂位图和布隆过滤器