golang的interface
0.介绍
接口是 Go 语言提供的数据类型之一,它把所有具有共性的方法 (注意与函数区别开) 定义在一起,任何其它类型只要一一实现这些方法的话,我们就称这个类型实现了这个接口。Go 语言的接口与 C++ 的虚函数有共通之处,提高了语言的灵活性的同时也弥补了语言自身的一些不足。
Go 语言的接口与其它面向对象语言的接口不同,Go 的接口只是用来对方法进行一个收束,而正是这个收束,使得 Go 这个面向过程的语言拥有了面向对象的特征。
一般来说,Go 接口的主要功能有:
- 作为方法的收束器,进行具有 “面向对象程序设计特色” 的程序设计。
- 作为各种数据的承载者,可以用来为函数接收各类不同数量的函数参数,这也是 Go 提倡的接口编程。
1.实例
Golang中的interface
先说说接口,接口我理解为一些行为的集合。似乎还是很懵x。来看看代码和允许效果,再说。
2.空接口
一个空接口 interface{}
什么方法 (method) 也没有实现,是一个能装入任意数量、任意数据类型的数据容器。
为什么这样说呢?是这样的。空接口 interface{}
也是接口,不过是没有实现方法的接口罢了。回顾接口的定义:接口是一组方法的集合,是一种数据类型,任何其他类型如果能实现接口内所有的方法的话,我们称那个数据类型实现了这个接口。咱们再来看空接口:里面连一个方法也没有,不也就是任意数据类型都能实现这个接口了嘛。这就和 “空集能被任意集合包含” 一样嘛,空接口能被任意数据类型实现。
与 C 语言的 void *
可以转换成任意其它类型的指针 (如 char *
、int *
等) 不同的是,Go 语言的 interface{}
不是一个任意数据类型,interface{}
的类型就是 interface{}
类型,不能转换成其他接口类型,更不能转换成其他什么类型 (比如[]int
、string
等等) ,只不过是 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
}
标签:fmt,数据类型,接口,golang,Go,类型,interface From: https://blog.51cto.com/u_15326986/5806324