GO的interface的使用和反射

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

博客主页🏆看看是李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一个自定义类型可以实现多个接口。

7Go接口不能有任何变量。

8一个接口可以继承多个别的接口这时如果要实现这个接口必须实现它继承的所有接口的方法。在低版本的Go编辑器中一个接口继承其他多个接口时不允许继承的接口有相同的方法名。比如A接口继承B、C接口B、C接口的方法名不能一样。高版本的Go编辑器没有相关问题。

9interface类型默认是一个指针引用类型如果没有对interface初始化就使用那么会输出nil。

10空接口interface{}没有任何方法所以所有类型都实现了空接口即我们可以把任何一个变量赋给空接口类型。

反射简介

Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国

类型转换

由于接口是一般类型当我们使用接口时候可能不知道它是哪个类型实现的基本数据类型我们有对应的方法进行类型转换当然接口类型也有类型转换。

当然我们也可以用这个方式来进行类型的判断。

转换方式valtype=变量.(类型)

可以使用switch进行类型判读

func A(a interface{})  {
	switch a.(type) {
	case int:
		fmt.Println("INT")
	}
}

 反射

反射是程序执行时检查其所拥有的结构。尤其是类型的一种能力。这是元编程的一种形式。它同一时候也是造成混淆的重要来源。

每一个语言的反射模型都不同同一时候很多语言根本不支持反射python通过hasattr方法实现

go语言中的反射通过refect包实现reflect包实现了运行时反射允许程序操作任意类型的对象。

在介绍反射之前先说明下reflect包中的两个数据类Type和Value。

Type

TypeType类型用来表示一个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博客

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: go

“GO的interface的使用和反射” 的相关文章