接口

声明

允许定义能够保存任何类型的变量和函数参数,前提是它定义了特定的方法。

使用interface关键字定义一个接口类型,后面跟着一个花括号,内部含有一组方法,以及方法期望的参数和返回值。

image-20201104092041012

image-20201104095243343

如果一个类型包含接口中声明的所有方法,那么它可以在任何需要接口的地方使用,而不需要更多的声明。


测试

package main

type myInterface interface {
	printf()
	close()
}
type myInt int64
func (m *myInt)printf()  {
	println("myInt:",*m)
}
func (m *myInt)close()  {
	println("myInt:Close")
}

func main() {
	m:=myInt(1)
	var a myInterface = &m
	a.printf()
	a.close()
}

image-20201104102242224


类型断言

当你将一个具体类型的值赋给一个接口类型的变量时,类型断言让你能取回具体类型。这像一种形式的类型转换。它的语法甚至像函数调用和类型转换的合体。在一个接口值之后,你输入一个点,后面接着一对括号括起来的具体类型(或者,你想要断言的值的具体类型)。

一旦你使用类型断言来取回具体类型的值,你可以调用那个类型上的方法,但这方法并不属于接口。

package main

type myInterface interface {
	printf()
	close()
}
type myInt int64
func (m *myInt)printf()  {
	println("myInt:",*m)
}
func (m *myInt)close()  {
	println("myInt:Close")
}
func (m *myInt)make()  {
	print("make")
}

func main() {
	m:=myInt(1)
	var a myInterface = &m
	a.printf()
	a.close()
	a1 ,a2 := interface{}(a).(myInt)
	println(a1,a2)
	a1.make()
}

image-20201104103809928

  • 在这里只要是在声明时或函数传进来的参数不是interface类型那么做类型断言都是回报 non-interface的错误的
  • 所以我们只能通过将s作为一个interface{}的方法来进行类型断言

空接口

Interface{}类型称为空接口,用来接收任何类型的值。不需要实现任何方法来满足空接口,所以所有的类型都满足它。

image-20201104104736070


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

恢复 上一篇
封装和嵌入 下一篇