golang的interface

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang的interface相关的知识,希望对你有一定的参考价值。

golang的interface

0.介绍

接口是 Go 语言提供的数据类型之一,它把所有具有共性的方法 (注意与函数区别开) 定义在一起,任何其它类型只要一一实现这些方法的话,我们就称这个类型实现了这个接口。Go 语言的接口与 C++ 的虚函数有共通之处,提高了语言的灵活性的同时也弥补了语言自身的一些不足。

Go 语言的接口与其它面向对象语言的接口不同,Go 的接口只是用来对方法进行一个收束,而正是这个收束,使得 Go 这个面向过程的语言拥有了面向对象的特征。

一般来说,Go 接口的主要功能有:

  1. 作为方法的收束器,进行具有 “面向对象程序设计特色” 的程序设计。
  2. 作为各种数据的承载者,可以用来为函数接收各类不同数量的函数参数,这也是 Go 提倡的接口编程。

1.实例

Golang中的interface

先说说接口,接口我理解为一些行为的集合。似乎还是很懵x。来看看代码和允许效果,再说。




2.空接口

一个空接口 interface 什么方法 (method) 也没有实现,是一个能装入任意数量、任意数据类型的数据容器。

为什么这样说呢?是这样的。空接口 interface 也是接口,不过是没有实现方法的接口罢了。回顾接口的定义:接口是一组方法的集合,是一种数据类型,任何其他类型如果能实现接口内所有的方法的话,我们称那个数据类型实现了这个接口。咱们再来看空接口:里面连一个方法也没有,不也就是任意数据类型都能实现这个接口了嘛。这就和 “空集能被任意集合包含” 一样嘛,空接口能被任意数据类型实现。

与 C 语言的 void * 可以转换成任意其它类型的指针 (如 char *int * 等) 不同的是,Go 语言的 interface 不是一个任意数据类型,interface 的类型就是 interface 类型,不能转换成其他接口类型,更不能转换成其他什么类型 (比如[]intstring等等) ,只不过是 interface装入任意数据罢了。

把其它类型的变量转换成interface类型后,在程序运行时 (runtime) 内,该变量的数据类型将会发生变化,但是如果这时候要求获取该变量的数据类型,我们会得到interface类型。这是为啥子呢?

在 Golang 的源代码中,用runtime.iface表示非空接口类型,用runtime.eface表示空接口类型interface。虽然它们俩都用一个interface声明,但是后者在 Golang 的源代码更加常见,所以在实现interface时,使用了特殊的类型。具体的你得看 Golang 源代码和 Go 手册了。


3.断言

3.1 定义

3.2 v,ok=x.(Y)应用

func main() 
	var x interface
	x = "pprof.cn"
	v, ok := x.(string)
	if ok 
		fmt.Println(v)
	 else 
		fmt.Println("类型断言失败")
	
	//输出:pprof.cn

func main() 
	var x interface
	x = "pprof.cn"
	v, ok := x.(bool)
	if ok 
		fmt.Println(v)
	 else 
		fmt.Println("类型断言失败")
	
	//输出:类型断言失败

3.3 type switch 语句介绍

func justifyType(x interface) 
	switch v := x.(type) 
	case string:
		fmt.Printf("x is a string,value is %v\\n", v)
	case int:
		fmt.Printf("x is a int is %v\\n", v)
	case bool:
		fmt.Printf("x is a bool is %v\\n", v)
	default:
		fmt.Println("unsupport type!")
	

func main() 
	var x interface
	x = "pprof.cn"
	justifyType(x) //输出:x is a string,value is pprof.cn

参考文章

文章1

文章2

文章3

文章4

以上是关于golang的interface的主要内容,如果未能解决你的问题,请参考以下文章

golang reflect反射(一):interface接口的入门(大白话)

golang之interface

golang中接口interface和struct结构类的分析

golang中Any类型使用及空接口中类型查询

[Journey with golang] 4. Interface

Golang通脉之接口