欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Go语言interface(接口)的作用

程序员文章站 2022-03-04 13:47:51
...
示例代码
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,否则就存在循环递归调用,也就是出现了死循环。

相关标签: 接口