其實說白了,介面就是一種協議,統一乙個標準。你要呼叫我,那你就必須實現我的這些方法。我不需要知道你是怎麼實現的,但是你一定要實現。甚至在objec-c當中都不叫inte***ce,直接protocol。
我相信不少剛接觸inte***ce的人會跟我有一樣的疑惑,我實現介面跟不實現介面沒什麼區別啊?反正都要實現這些方法。問題的誤區就在於,介面的使用並不是單人開發模式的。你寫接**寫實現,就不用寫介面了。我寫接**實現,介面不就用上了。我不給你規定好了,你怎麼知道該實現哪些內容呢。實際上也就是個「規範」。
我實現了某個服務,你可以來呼叫我的服務,但是呼叫我的服務之前你必須滿足某些約束(實現方法),才能呼叫我寫好了這些服務。這個時候介面的作用就出來了,介面約束了你必須滿足的前置條件。看完下面的**,你就明白了:
package main
import (
"fmt"
)type sorter inte***ce
func sort(x sorter) }}
}type xi int
type xs string
func (p xi) len() int
func (p xi) less(i int, j int) bool
func (p xi) swap(i int, j int)
func (p xs) len() int
func (p xs) less(i int, j int) bool
func (p xs) swap(i int, j int)
func main()
strings := xs
sort(ints)
fmt.printf("%v\n", ints)
sort(strings)
fmt.printf("%v\n", strings)
}
我已經實現好了排序方法,但是我不知道你會傳入什麼進行排序。於是我寫了個介面,你只要實現了介面的全部方法,那麼我就允許你呼叫我的服務,進行排序。
在其他程式語言當中,都是誰提供服務,誰提供介面。你需要呼叫我的服務,就必須宣告你實現了我的介面。
翻譯**話就是我通過一些特定邏輯完成了某個功能,別的模組想要呼叫我這個功能,就必須把我這個功能裡使用的這些函式都給實現了。
而這在邏輯上實際是說不通的,服務提供者怎麼會確切的知道服務使用者的具體需求呢?當需求發生變化的時候,服務提供者就需要考慮使用者的需求,從而設計介面。而從理論上來說,每乙個服務的開發人員都應該專注於自己的服務。
而go語言不同。go語言的介面是非侵入式介面,只要呼叫者本身實現了該介面的全部方法,就預設實現了該介面(事實上也確實是實現了這個介面),而不需要顯示的宣告實現某個介面。這極大的方便了介面的呼叫,開發人員不必再需要苦想介面的粒度,只需要專注功能函式的實現就可以了。
宣告:sunansheng 發表於 2019-04-25 21:54:00 ,共計680字。
go語言介面為什麼是顛覆性的? | www.sunansheng.com
為什麼雲計算是最具顛覆性的力量
如今,雲計算成為了資訊科技部門面臨的最具破壞力的力量之一。這種說法不無道理。讓我們了解一下這一現象的嚴重性。根據貝恩公司的名為 雲計算的變化面貌 研究報告,全球雲計算it市場收入預計將從2020年的1800億美元增長到3900億美元,折合年復合增長率 cagr 約17 報告還指出,2015年雲計算需...
為什麼雲計算是最具顛覆性的力量
如今,雲計算成為了資訊科技部門面臨的最具破壞力的力量之一。這種說法不無道理。讓我們了解一下這一現象的嚴重性。根據貝恩公司的名為 雲計算的變化面貌 研究報告,全球雲計算it市場收入預計將從2020年的1800億美元增長到3900億美元,折合年復合增長率 cagr 約17 報告還指出,2015年雲計算需...
為什麼 go 中的 map 的遍歷是隨機的?
雜湊表是無序的,這很好理解。但是golang中的 map 兩次遍歷不但是無序的,而且兩次不相同,見下 func f m map int int for i range s 以下兩次輸出會相同嗎?for k,v range m fmt.println for k,v range m 33 55 99 ...