? ? 在?向物件語?中,接??于定義物件的?為,接?只指定物件應該做什么,但具體怎么做,介面不用管,實作細節交給里面的struct就可以了,
在Go語?中,接?是?組?法Methods[]簽名,
- 接?只指定了struct應該具有的?法;
- 當某個struct為接?中的所有?法提供了具體的實作細節時,這個struct就被稱為實作了該接?;
- 接?定義了?組?法,如果某個物件實作了該接?的所有?法,則此物件就實作了該接?,
Go語?的struct都是隱式實作接?的,
- 任何定義了接?中所有?法的struct,都被稱為隱式地實作了該接?,
interface介面的定義
type 接?名字 interface {
? ? ?法1([引數串列]) [回傳值]
? ? ?法2([引數串列]) [回傳值]
? ? ?法3([引數串列]) [回傳值]
}
使用介面的意義
- 第?,結構體型別T不需要顯式地宣告它實作了接? I,只要型別 T 實作了接? I 規定的所有?法,它就?動地實作了接? I, 這樣就像動態語??樣省了很多代碼,少了許多限制,
- 第?,將結構體型別的變數顯式或者隱式地轉換為接? I 型別的變數i,這樣就可以和其它靜態型別語??樣,在編譯時檢查引數的合法性,
? ? 案例如下:
//myInterface.go
// myInterfaceDuck project main.go
package main
import (
"fmt"
)
type ISayHello interface {
SayHello()
}
type Person struct{}
type Duck struct{}
type Duck2 struct{}
func (per Person) SayHello() {
fmt.Printf("Hello!")
}
func (duck Duck) SayHello() {
fmt.Printf("ga ga ga!")
}
func greeting(i ISayHello) {
i.SayHello()
}
func main() {
//fmt.Println("Hello World!")
per := new(Person)
duck := new(Duck)
fmt.Println("非介面呼叫形式")
per.SayHello()
duck.SayHello()
fmt.Println("\n-------------")
//定義介面變數
fmt.Println("介面呼叫形式")
var i ISayHello
i = per
greeting(i)
i = duck
greeting(i)
}
? ? 效果如下:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/152694.html
標籤:其他
上一篇:區塊鏈技術在司法行業的服務應用
