1. 程式人生 > >Go語言interface(介面)的作用

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,否則就存在迴圈遞迴呼叫,也就是出現了死迴圈。