教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 go语言接口的基本概念

go语言接口的基本概念

发布时间:2021-05-07   编辑:jiaochengji.com
教程集为您提供go语言接口的基本概念等资源,欢迎您收藏本站,我们将为您提供最新的go语言接口的基本概念资源

接口的基本概念

接口声明

  1. 使用接口字面量的场景非常少,一般只有空接口interface{}类型的变量的声明才会使用
  2. 接口支持嵌套接口

接口字面量类型的声明语法

interface {
    MethodSignature1
    MethodSignature2
}

接口命名类型使用type关键字声明语法

type InterfaceName interface{
    MethodSignature1
    MethodSignature2
}

方法声明

Go语言中的函数没有使用“函数声明”,类型的方法本质上就是函数的一种特殊的形式。我们提到了“方法声明”的概念,而不是方法签名。这里有必要澄清一下这两个概念:严格意义上的函数签名是函数的字面量类型,函数签名是不包括函数名的,而函数声明是指带上函数名的函数签名,同理,对于方法也是一样,接口定义使用方法声明,而不是方法签名,因为方法名是接口的组成成分

声明接口类型的特点

  1. 接口的命名一般以er结尾
  2. 接口定义的内部方法声明不需要func引导
  3. 在接口定义中,只有方法声明没有方法实现

接口初始化

  1. 没有初始化的接口变量,其默认值是nil
  2. 接口绑定具体类型的实例的过程叫做接口初始化

接口方法调用

package main

type Printer interface {
	print()
}

type S struct{}

//定义方法,实现接口
func (s S) print() {
	println("print")
}

func main() {
	var i Printer
	//没有初始化的接口调用其方法会产生panic

	i = S{}
	i.print()
}

接口的动态类型和静态类型

  1. 接口绑定的具体实例类型称为接口的动态类型
  2. 接口被定义时,其类型就已经被确定了,这个类型叫做接口的静态类型
  3. 静态类型的本质特征就是接口的方法签名集合,两个接口如果方法签名集合相同,则这两个接口在语义上完全等价,他们之间不需要强制类型转换就可以相互赋值

接口运算

  1. 类型断言
  2. 接口类型查询

类型断言

接口类型断言的语法形式如下:

i.(TypeName)

i必须是接口变量,TypeName可以是接口类型名,也可以是具体类型名

接口断言的两层语义

  1. 如果TypeName是一个具体类型名,则类型断言用于判断接口变量i绑定的实例类型是否就是具体类型TypeName
  2. 如果TypeName是一个接口类型名,则类型断言用于判断接口变量i绑定的实例类型是否同时实现了TypeName接口

接口断言的两种语法表现

  1. 直接赋值模式:o := i.(TypeName)
  2. comma,ok 模式
if o, ok := i . (TypeName) ; ok {
    //ok的值为ture or false
    //o为类型
}

类型查询

接口查询的语法格式如下:

switch v := i . (type) {
case type1 :
    xxx
case type2 :
    xxx
default:
    xxx
}

接口查询有两层语义:一是查询一个接口变量底层绑定的底层变量的具体类型是什么,二是查询接口变量绑定的底层变量是否还实现了其他接口

  1. i必须是接口类型
  2. case字句后面可以跟非接口类型名,也可以跟接口类型名,匹配是按照case字句的顺序进行
  3. fallthrough语句不能再type switch语句中使用

空接口

没有任何方法的接口称之为空接口,空接口表示为interface{ },空接口内部封装了指针

空接口的用途:

  1. 空接口和泛型

go语言没有泛型,如果一个函数需要接受任意类型的参数,则参数类型可以使用空接口类型,这是弥补了没有泛型的一种手段

  1. 空接口和反射

空接口是反射实现的基础,反射库就是将相关具体的类型转换并赋值给空接口后才去处理

空接口和nil

空接口不是真的为空,接口有类型和值两个概念

到此这篇关于“go语言接口的基本概念”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
go run main.go 参数_Go语言入门:Hello world
Go语言发展历史、核心、特性及学习路线
Go语言的主要特性和发展影响
go语言接口的基本概念
go语言核心编程_Go语言核心编程李文塔
浅谈golang中的接口
关于Golang的那些事(六) -- 接口
【Go语言入门系列】(八)Go语言是不是面向对象语言?
go 获取函数地址_Go语言基础--接口浅析

[关闭]
~ ~