介面
- 基本介紹
- 介面快速入門
- 基本語法
- 介面使用注意事項
基本介紹
在Go語言中介面(interface)是一種型別,一種抽象的型別,
interface是一組method的集合,是duck-type programming的一種體現,介面做的事情就像是定義一個協議(規則),只要一臺機器有洗衣服和甩干的功能,我就稱它為洗衣機,不關心屬性(資料),只關心行為(方法),
在Golang中,多型特性主要是通過介面來體現的,
介面快速入門

用程式來模擬一下上圖中的應用場景,
package main
import(
"fmt"
)
//定義一個介面
type Usb interface{
//宣告了兩個沒有實作的方法
Start()
Stop()
}
type Phone struct{
}
//讓Phone實作Usb介面的方法
func (p Phone) Start(){
fmt.Println("手機開始作業了.....")
}
func (p Phone) Stop(){
fmt.Println("手機停止作業了.....")
}
type Camera struct{
}
//讓Camera實作Usb介面
func (c Camera) Start(){
fmt.Println("相機開始作業了.....")
}
func (c Camera) Stop(){
fmt.Println("相機停止作業了.....")
}
//計算機
type Computer struct{
}
//撰寫一個方法Working,接受一個Usb介面型別的變數
func (c Computer) Working(usb Usb){
//通過usb介面變數來呼叫Start和Stop方法
usb.Start()
usb.Stop()
}
func main() {
computer := Computer{}
phone := Phone{}
camera := Camera{}
computer.Working(phone)
computer.Working(camera)
}
運行結果:

基本語法
interface型別可以定義一組方法,但是這些不需要實作,并且interface不能包含任何變數,到某個自定義型別(比如結構體Phone)要使用的時候,在根據具體情況把這些方法寫出來,
基本語法:
type 介面名 interface{
method1(引數串列) 回傳值串列
method2(引數串列) 回傳值串列
}
說明:
- 介面里的所有方法都沒有方法體,即介面的方法都是沒有實作的方法,介面體現了程式設計的多型和高內聚低耦合的思想,
- Golang中的介面,不需要顯示的實作,只要有一個變數,含有介面型別中的所有方法,那么這個變數就實作了這個介面,Golang中沒有implement這樣的關鍵字,
介面使用注意事項
- 介面本身不能創建實體,但是可以指向一個實作了該介面的自定義型別的變數(實體)
package main
import(
"fmt"
)
type AInterface interface{
Say()
}
type stu struct{
name string
}
func (s stu)Say(){
fmt.Println("stu Say()...")
}
func main(){
var s stu
var a AInterface = s
a.Say()
}
- 介面中所有方法都沒有方法體,即都是沒有實作的方法,
- 在Golang中,一個自定義型別需要將某個介面的所有方法都實作,我們說這個自定義型別實作了該介面,
- 一個自定義型別只有實作了某個介面,才能將該自定義型別的實體賦給介面型別,
- 只要是自定義資料型別,就可以是實作介面,不僅僅是結構體型別,
package main
import(
"fmt"
)
type AInterface interface{
Say()
}
func (i integer)Say(){
fmt.Println("integer Say()...")
}
type integer int
func main(){
var i integer
var a AInterface = i
a.Say()
}
運行結果:

-
一個自定義型別可以實作多個介面,
-
golang介面中不能有任何邊變數,

-
interface型別默認是一個指標(參考型別),如果沒有對interface初始化就使用,那么會輸出nil.
-
空介面interface{}沒有任何方法,所以所有型別都實作了空介面,我們可以把任何一個變數賦給空介面,
package main
import(
"fmt"
)
type T interface{
}
func main(){
var i int = 100
var t T = i
fmt.Println(t)
}
博主首頁鏈接:https://blog.csdn.net/weixin_44736475
原創不易,希望大家多多支持
如果文章對你有幫助,記得一鍵三連哦!??????
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/265676.html
標籤:區塊鏈
下一篇:分布式 | 拜占庭將軍問題
