什么是接口:接口(interface)定義了一個(gè)對(duì)象的行為規(guī)范,只定義規(guī)范不實(shí)現(xiàn),由具體的對(duì)象來(lái)實(shí)現(xiàn)規(guī)范的細(xì)節(jié)。
接口
Golang 接口的定義
在Go語(yǔ)言中接口(interface)是一種類(lèi)型,一種抽象的類(lèi)型。
interface是一組method的集合,是duck-type programming的一種體現(xiàn)。
接口做的事情就像是定義一個(gè)協(xié)議(規(guī)則),只要一臺(tái)機(jī)器有洗衣服和甩干的功能,我就稱(chēng)它為洗衣機(jī)。不關(guān)心屬性(數(shù)據(jù)),只關(guān)心行為(方法)。
前提概要:
(1)接口中可以定義一組方法,但不需要實(shí)現(xiàn),不需要方法體。并且接口中不能包含任何變量。到某個(gè)自定義類(lèi)型要使用的時(shí)候(實(shí)現(xiàn)接口的時(shí)候),再根據(jù)具體情況把這些方法具體實(shí)現(xiàn)出來(lái)。
(2)實(shí)現(xiàn)接口要實(shí)現(xiàn)所有的方法才是實(shí)現(xiàn)。
(3)Golang中的接口不需要顯式的實(shí)現(xiàn)接口。Golang中沒(méi)有implement關(guān)鍵字。
(Golang中實(shí)現(xiàn)接口是基于方法的,不是基于接口的)
例如:
A接口 a,b方法
B接口 a,b方法
C結(jié)構(gòu)體 實(shí)現(xiàn)了 ?a,b方法 ,那么C實(shí)現(xiàn)了A接口,也可以說(shuō)實(shí)現(xiàn)了B接口 ? (只要實(shí)現(xiàn)全部方法即可,和實(shí)際接口耦合性很低,比Java松散得多)
(4)接口目的是為了定義規(guī)范,具體由別人來(lái)實(shí)現(xiàn)即可。
為什么要使用接口
type Cat struct{}
func (c Cat) Say() string { return "喵喵喵" }
type Dog struct{}
func (d Dog) Say() string { return "汪汪汪" }
func main() {
c := Cat{}
fmt.Println("貓:", c.Say())
d := Dog{}
fmt.Println("狗:", d.Say())
}
上面的代碼中定義了貓和狗,然后它們都會(huì)叫,你會(huì)發(fā)現(xiàn)main函數(shù)中明顯有重復(fù)的代碼,如果我們后續(xù)再加上豬、青蛙等動(dòng)物的話,我們的代碼還會(huì)一直重復(fù)下去。那我們能不能把它們當(dāng)成“能叫的動(dòng)物”來(lái)處理呢?
像類(lèi)似的例子在我們編程過(guò)程中會(huì)經(jīng)常遇到:
比如一個(gè)網(wǎng)上商城可能使用支付寶、微信、銀聯(lián)等方式去在線支付,我們能不能把它們當(dāng)成“支付方式”來(lái)處理呢?
比如三角形,四邊形,圓形都能計(jì)算周長(zhǎng)和面積,我們能不能把它們當(dāng)成“圖形”來(lái)處理呢?
比如銷(xiāo)售、行政、程序員都能計(jì)算月薪,我們能不能把他們當(dāng)成“員工”來(lái)處理呢?
Go語(yǔ)言中為了解決類(lèi)似上面的問(wèn)題,就設(shè)計(jì)了接口這個(gè)概念。接口區(qū)別于我們之前所有的具體類(lèi)型,接口是一種抽象的類(lèi)型。當(dāng)你看到一個(gè)接口類(lèi)型的值時(shí),你不知道它是什么,唯一知道的是通過(guò)它的方法能做什么。
Go語(yǔ)言提倡面向接口編程
接口是一個(gè)或多個(gè)方法簽名的集合。
任何類(lèi)型的方法集中只要擁有該接口'對(duì)應(yīng)的全部方法'簽名。
就表示它 "實(shí)現(xiàn)" 了該接口,無(wú)須在該類(lèi)型上顯式聲明實(shí)現(xiàn)了哪個(gè)接口。
這稱(chēng)為Structural Typing。
所謂對(duì)應(yīng)方法,是指有相同名稱(chēng)、參數(shù)列表 (不包括參數(shù)名) 以及返回值。
當(dāng)然,該類(lèi)型還可以有其他方法。
接口只有方法聲明,沒(méi)有實(shí)現(xiàn),沒(méi)有數(shù)據(jù)字段。
接口可以匿名嵌入其他接口,或嵌入到結(jié)構(gòu)中。
對(duì)象賦值給接口時(shí),會(huì)發(fā)生拷貝,而接口內(nèi)部存儲(chǔ)的是指向這個(gè)復(fù)制品的指針,既無(wú)法修改復(fù)制品的狀態(tài),也無(wú)法獲取指針。
只有當(dāng)接口存儲(chǔ)的類(lèi)型和對(duì)象都為nil時(shí),接口才等于nil。
接口調(diào)用不會(huì)做receiver的自動(dòng)轉(zhuǎn)換。
接口同樣支持匿名字段方法。
接口也可實(shí)現(xiàn)類(lèi)似OOP中的多態(tài)。
空接口可以作為任何類(lèi)型數(shù)據(jù)的容器。
一個(gè)類(lèi)型可實(shí)現(xiàn)多個(gè)接口。
接口命名習(xí)慣以 er 結(jié)尾。
接口的定義格式如下:
type 接口類(lèi)型名 interface{
方法名1( 參數(shù)列表1 ) 返回值列表1
方法名2( 參數(shù)列表2 ) 返回值列表2
…
}
? ?1.接口名:使用type將接口定義為自定義的類(lèi)型名。
Go語(yǔ)言的接口在命名時(shí),一般會(huì)在單詞后面添加er,如有寫(xiě)操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出該接口的類(lèi)型含義。
? ? 2.方法名:當(dāng)方法名首字母是大寫(xiě)且這個(gè)接口類(lèi)型名首字母也是大寫(xiě)時(shí),這個(gè)方法可以被接口所在的包(package)之外的代碼訪問(wèn)。
? ? 3.參數(shù)列表、返回值列表:參數(shù)列表和返回值列表中的參數(shù)變量名可以省略。 ??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-636978.html
接口案例:
演示1:
package main
import(
"fmt"
)
//接口是一個(gè)規(guī)范
type Apper interface{
start()
stop()
}
//如果接口里面有方法的話,必要要通過(guò)結(jié)構(gòu)體或者通過(guò)自定義類(lèi)型實(shí)現(xiàn)這個(gè)接口
type Phone_index struct{
Name string
}
//手機(jī)要實(shí)現(xiàn)usb接口的話必須得實(shí)現(xiàn)usb接口中的所有方法,記住是所有方法
//可以多加方法,后面實(shí)例化可以調(diào)出來(lái),但是接口的所有方法要包含在內(nèi)
func (a Phone_index) start(){
fmt.Println(a.Name, "啟動(dòng)")
}
func (a Phone_index) stop(){
fmt.Println(a.Name,"關(guān)閉")
}
type Window_index struct{
Name string
}
func(b Window_index) start(){
fmt.Println(b.Name, "啟動(dòng)")
}
func(b Window_index) stop(){
fmt.Println(b.Name, "關(guān)閉")
}
func(b Window_index) gane(){
fmt.Println(b.Name, "開(kāi)局亂砂")
}
func main(){
p := Phone_index{
Name: "香蕉手機(jī)",
}
var p1 Apper
p1 = p
p1.start()
p1.stop()
w := Window_index{
Name: "原神",
}
var w1 Apper
w1 = w
w1.start()
w1.stop()
w.gane()
}
幾則注意點(diǎn):文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-636978.html
接口是一個(gè)規(guī)范
如果接口里面有方法的話,必要要通過(guò)結(jié)構(gòu)體或者通過(guò)自定義類(lèi)型實(shí)現(xiàn)這個(gè)接口
手機(jī)要實(shí)現(xiàn)app接口的話必須得實(shí)現(xiàn)app接口中的所有方法,記住是所有方法\
可以多加方法,后面實(shí)例化可以調(diào)出來(lái),但是接口的所有方法要包含在內(nèi)
到了這里,關(guān)于Golang 中的接口詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!