Go語言interface(介面)的作用
阿新 • • 發佈:2019-01-06
示例程式碼
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
,否則就存在迴圈遞迴呼叫,也就是出現了死迴圈。