Go语言interface(接口)的作用

示例代码
package main

import "fmt"

type Computer interface {
	Calculator
	Play(string) string
}

type Calculator interface {
	Open(string) Calculator
	Say(string) string
	Add(uint, uint)
	Sum(int, int) int
}

type TOM struct {
	Name string
	Age  int
	Bob  *BOB
	n    int
}

type BOB struct {
	TOM
	MyName string
}

func (t *TOM) Open(s string) Calculator {
	if s == "" {
		return t
	}
	return t.Bob
}

func Test(c Calculator) {

}

func (t *TOM) Say(string) string {
	return "I am " + t.Name
}

func (t *TOM) Add(a, b uint) {
	fmt.Println(a + b)
}

func (t *TOM) Sum(a, b int) int {
	return a + b
}

func (t *TOM) Play(s string) string {
	return s
}

func (b *BOB) Say(string) string {
	return "My Name is " + b.MyName
}

func main() {
	b := new(BOB)
	b.MyName = "Bob"
	t := new(TOM)
	t.Name = "Tom"
	t.Age = 12
	fmt.Println(t.Say(""))
	Test(b)
	Test(t)
}

上面的例子中,定义了两个接口CalculatorComputer,两个结构体TOMBOBTOM实现了接口Calculator,而BOB里面嵌套了TOM,所以也实现了接口Calculator,而接口Computer里面嵌套了Calculator,所以Computer也实现了Calculator
在Go语言中接口(interface)常常被用来当做某个函数的参数传递,也有时候,接口被用来当做返回值类型,

参数传递

比如上面的例子

func Test(c Calculator) {
}
Open(string) Calculator
func (t *TOM) Open(s string) Calculator {
	if s == "" {
		return t
	}
	return t.Bob
}

函数Test(c Calculator)的参数类型是接口Calculator,这是什么意思呢,函数TEST()该如何调用呢,意思就是,当一个函数或方法的参数类型是一个接口时,哪个struct()实现了该接口,那么这个结构体对象,就可以被当做参数传递。
结构体TOMBOB都实现了接口Calculator,所以他们的对象可以被当做参数被传递到Test()里面,

b := new(BOB)
b.MyName = "Bob"
t := new(TOM)
t.Name = "Tom"
t.Age = 12
fmt.Println(t.Say(""))
Test(b)
Test(t)

返回值类型

上面有一个方法Open(),它的返回值是一个接口Calculator,这个意思就是只要哪个struct实现了接口Calculator,那么该结构体对象就可以被当做参数返回

func (t *TOM) Open(s string) Calculator {
	if s == "" {
		return t
	}
	return t.Bob
}

TOMBOB都实现了接口Calculator,所以他们都可以被作为Open()的返回值返回。

struct(结构体)嵌套

在使用结构体嵌套时要注意,当结构体BOB里面嵌套了TOM的时候,结构体TOM里面还可以将BOB作为某个变量的字段类型,但是TOM里面不可以再嵌套BOB,否则就存在循环递归调用,也就是出现了死循环。

猜你喜欢

转载自blog.csdn.net/Charliewolf/article/details/85343345