博客主页:🏆看看是李XX还是李歘歘 🏆
🌺每天不定期分享一些包括但不限于计算机基础、算法、后端开发相关的知识点,以及职场小菜鸡的生活。🌺
💗点关注不迷路,总有一些📖知识点📖是你想要的💗
目录
interface简介
interface定义
interface使用
接口嵌套
反射简介
类型转换
反射
Type
Value
interface简介
interface(接口)是golang最重要的特性之一,Interface类型可以定义一组方法,但是这些不需要实现。并且interface不能包含任何变量。
简单的说:
-
interface是方法的集合
-
interface是一种类型,并且是指针类型
-
interface的更重要的作用在于多态实现
interface定义
type 接口名称 interface { method1 (参数列表) 返回值列表 method2 (参数列表) 返回值列表 ... }
interface使用
-
接口的使用不仅仅针对结构体,自定义类型、变量等等都可以实现接口。
-
如果一个接口没有任何方法,我们称为空接口,由于空接口没有方法,所以任何类型都实现了空接口。
-
要实现一个接口,必须实现该接口里面的所有方法。
接口嵌套
go语言中的接口可以嵌套,可以理解为继承,子接口拥有父接口的所有方法,并且想要使用该子接口的话,必须将父接口和子接口的所有方法都实现。
https://www.jb51.net/article/255451.htm#_lab2_0_0
(1)接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量(实例)。
接口中所有的方法都没有方法体,即都是没有实现的方法。
(3)在Go中,一个自定义类型需要将某个接口的所有方法都实现,我们说这个自定义类型实现了该接口。
(4)一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型。
(5)只要是自定义数据类型就可以实现接口,不仅仅是结构体类型。
(6)一个自定义类型可以实现多个接口。
(7)Go接口不能有任何变量。
(8)一个接口可以继承多个别的接口,这时如果要实现这个接口必须实现它继承的所有接口的方法。在低版本的Go编辑器中,一个接口继承其他多个接口时,不允许继承的接口有相同的方法名。比如A接口继承B、C接口,B、C接口的方法名不能一样。高版本的Go编辑器没有相关问题。
(9)interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil。
(10)空接口interface{}没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口类型。
反射简介
Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国
类型转换
由于接口是一般类型,当我们使用接口时候可能不知道它是哪个类型实现的,基本数据类型我们有对应的方法进行类型转换,当然接口类型也有类型转换。
当然我们也可以用这个方式来进行类型的判断。
转换方式:val,type:=变量.(类型)
可以使用switch进行类型判读
func A(a interface{}) {
switch a.(type) {
case int:
fmt.Println("INT")
}
}
反射
反射是程序执行时检查其所拥有的结构。尤其是类型的一种能力。这是元编程的一种形式。它同一时候也是造成混淆的重要来源。
每一个语言的反射模型都不同(同一时候很多语言根本不支持反射,python通过hasattr方法实现)
go语言中的反射通过refect包实现,reflect包实现了运行时反射,允许程序操作任意类型的对象。
在介绍反射之前先说明下reflect包中的两个数据类Type和Value。
Type
Type:Type类型用来表示一个go类型。
不是所有go类型的Type值都能使用所有方法。请参见每个方法的文档获取使用限制。在调用有分类限定的方法时,应先使用Kind方法获知类型的分类。调用该分类不支持的方法会导致运行时的panic。
获取Type对象的方法:
reflect.TypeOf(str)
Value
不是所有go类型值的Value表示都能使用所有方法。请参见每个方法的文档获取使用限制。在调用有分类限定的方法时,应先使用Kind方法获知该值的分类。调用该分类不支持的方法会导致运行时的panic。
Value为go值提供了反射接口,获取Value对象方法:
reflect.ValueOf(str)
获取所有的类型:reflect.TypeOf(变量).Kind()
const (
Invalid Kind = iota
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
Array
Chan
Func
Interface
Map
Ptr
Slice
String
Struct
UnsafePointer
)
参考:
go语言之行--接口(interface)、反射(reflect)详解_ITPUB博客
(48条消息) go的继承封装多态_go怎么实现封装继承多态_李歘歘的博客-CSDN博客