golang接口interface

interface

  • 定义
  • 空接口

定义

接口是一个或多个方法签名的集合。
任何类型的方法集中只要拥有该接口对应的全部方法签名。 就表示它 “实现” 了该接口
举个例子来看一下:

//定义一个接口animal,其中包含say和move两个方法
type animal interface {
	say()
	move()
}
//分别定义两个结构体去实现animal接口,就需要实现接口的所有方法
type cat struct{}
type dog struct{}

func (*cat) move() {
	fmt.Printf("cat is runing....\n")
}
func (*dog) move() {
	fmt.Printf("dog is runing....\n")
}
func (*cat) say() {
	fmt.Printf("cat say:喵喵喵\n")
}
func (*dog) say() {
	fmt.Printf("cat say:汪汪汪\n")
}
func main() {
	var xiaohua animal = &cat{}
	var wangcai animal = &dog{}
	wangcai.move()
	wangcai.say()
	xiaohua.move()
	xiaohua.say()
}

如果没有实现所有方法,只实现了部分的方法会发生什么呢?

type animal interface {
	say()
	move()
}

type cat struct{}

func (*cat) say() {
	fmt.Printf("cat say:喵喵喵\n")
}
func main() {
	var xiaohua animal = &cat{}//这里会报错
	xiaohua.say()

这时会报一个这样的错误:

cannot use &(cat literal) (value of type *cat) as animal value in variable declaration: missing method saycompiler

意思是一个数据类型如果没有实现接口的所有方法,那么就不能实现该接口。也就是不能这样写:var xiaohua animal = &cat{},就是说如果cat缺少animal的任意一个方法它就不能是animal。
所以要实现一个接口就必须实现该接口的所以方法

空接口

空接口就像是万金油,它可以作为任意类型。主要运用于空接口作为函数的参数,可以接受任意类型的数据;空接口作为map值储存任意类型的数据。这里我就不详细写了。
既然空接口可以作为任意类型的数据,那么要怎样判断它里面的数据是什么类型呢?
这里就可以使用类型断言

x.(类型名)//其中x为接口,返回两个数据第一个是值,第二个是bool判断成功还是失败。
	var a interface{}
	a = 100
	v, ok := a.(int)
	fmt.Printf("v=%#v\nok=%#v\n", v, ok)

也可以定义一个函数来判断空接口的数据类型

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!")
	}
}

好了接口就说这么多,初学golang,如有不足,还请各位大佬多多指正。

你可能感兴趣的:(golang学习,golang,开发语言,后端)