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)
}
上面的例子中,定义了两个接口Calculator
和Computer
,两个结构体TOM
和BOB
,TOM
实现了接口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()实现了该接口,那么这个结构体对象,就可以被当做参数传递。
结构体TOM
和BOB
都实现了接口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
}
TOM
和BOB
都实现了接口Calculator
,所以他们都可以被作为Open()
的返回值返回。
struct(结构体)嵌套
在使用结构体嵌套时要注意,当结构体BOB
里面嵌套了TOM
的时候,结构体TOM
里面还可以将BOB
作为某个变量的字段类型,但是TOM
里面不可以再嵌套BOB
,否则就存在循环递归调用,也就是出现了死循环。
上一篇: 各种系统安装Node.js
下一篇: 搭建kafka集群