文章目录
- 面向对象
-
- 1、匿名字段
- 2、接口(❌)
-
- 2.1、类型与接口的关系
- 2.2、空接口
- 2.3、类型断言
面向对象
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、接口类型变量
我们可以通过接口类型.方法(参数列表)
,来实现接口中的方法,具有良好的代码可读性。
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、一个类型实现多个接口(狗可以叫、运动)
2、多个类型实现一个接口(车可以动、人也可以动)
3、接口嵌套(say接口和move接口,嵌套到animal接口中)
2.2、空接口
接口没有定义任何接口,任何类型都实现了空接口,空接口的变量可以存储任意类型的变量。
1、空接口的应用
1)作为函数的参数
2)作为map的值
2.3、类型断言
空接口可以存储任意类型的值,那么我们如何获取其存储的具体数据呢?
接口值:一个接口的值是由一个具体类型和具体类型的值两个部分组成的,这两个部分称为接口的动态类型和动态值
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net