Go语言中的接口

1、接口是用来定义行为的类型

对接口值方法的调用会执行接口值里存储的用户定义的类型的值对应的方法

eg:

package main

import "fmt"

type notifier interface {
	notify()
}

type user struct {
	name string
	email string
}

func (u *user) notify() {
	fmt.Printf("Sending user email to %s<%s>\n",
		u.name,
		u.email)
}

func main() {
	u := user{"miller", "1089795101@qq.com"}

	sendNotification(&u)
}

func sendNotification(n notifier) {
	n.notify()
}

2、方法集定义了接口的接受规则

因为不是总能获取一个值的地址,所以值的方法集只包括了使用值接收者实现的方法。

package main

import "fmt"

type notifier interface {
	notify()
}

type user struct {
	name string
	email string
}

func (u *user) notify() {
	fmt.Printf("Sending user email to %s<%s>\n",
		u.name,
		u.email)
}

func main() {
	u := user{"miller", "1089795101@qq.com"}
	//传值会报错
	sendNotification(u)
}

func sendNotification(n notifier) {
	n.notify()
}

报错:\TestInterface.go:23:18: cannot use u (type user) as type notifier in argument to sendNotification:
    user does not implement notifier (notify method has pointer receiver)

改:

package main

import "fmt"

type notifier interface {
	notify()
}

type user struct {
	name string
	email string
}
// 修改代码,用值做来接收者
func (u user) notify() {
	fmt.Printf("Sending user email to %s<%s>\n",
		u.name,
		u.email)
}

func main() {
	u := user{"miller", "1089795101@qq.com"}
	//传值会报错
	sendNotification(u)
}

func sendNotification(n notifier) {
	n.notify()
}

3、多态

package main

import "fmt"

//定义了通知类行为的接口
type notifier interface {
	notify()
}

//user在程序里定义了一个用户类型
type user struct {
	name string
	email string
}
// notify 使用指针接收者实现了notifier接口
func (u *user) notify() {
	fmt.Printf("Sending user email to %s<%s>\n",
		u.name,
		u.email)
}

//定义了程序里的管理员
type admin struct {
	name string
	email string
}

//使用指针接收者实现notifier接口
func (a *admin) notify() {
	fmt.Printf("Sending admin email to %s<%s>\n",
	a.name,
	a.email)
}

func main() {
	u := user{"miller", "1089795101@qq.com"}
	a := admin{"bob","american.cn"}
	//传值会报错
	sendNotification(&u)
	sendNotification(&a)
}

func sendNotification(n notifier) {
	n.notify()
}

 

函数 

sendNotification接收一个实现了notifier接口的值作为参数,这个函数能够实现多态的行为。
上一篇:Hi3559AV100 NNIE RFCN开发:V4L2->VDEC->VPSS->NNIE->VGS->VO系统整体动态调试实现


下一篇:Hi3559AV100外接UVC/MJPEG相机实时采图设计(三):V4L2接口通过MPP平台输出