在go
語言中,介面是一組方法的簽名。當某個型別為介面中的所有方法提供了方法的實現,它就實現了該介面。在go
語言中,介面和實現類的關係是非侵入式,也就是說乙個型別要實現介面的話沒必要顯式的去宣告自己實現了該介面,只要默默的將介面中的方法實現即可。
介面區別於我們之前所有的具體型別,介面是一種抽象的型別。當你看到乙個介面型別的值時,你不知道它是什麼,唯一知道的是通過它的方法能做什麼。
介面的定義:
type 介面名 inte***ce
如果介面沒有任何的方法宣告,那麼它就是乙個空介面,它的用途類似於物件導向裡的根型別object
,可被賦值為任何型別的物件。
介面預設值:
介面的預設值是nil
,如果實現介面的型別支援的話,可以做相等運算。
func
main()
fmt.
println
(v1 ==
nil, v1 == v2)
// true true
v1 =
100 v2 =
100 fmt.
println
(v1 == v2)
// true
}
介面的實現:
乙個物件只要全部實現了介面中的方法,那麼就實現了這個介面。換句話說,介面就是乙個需要實現的方法列表。
構建乙個action
介面,建立乙個student
類,然後實現action
介面。
type action inte***ce
type student struct
func
(s student)
speak()
func
(s student)
eat(
)func
(s student)
sleep()
func
main()
要實現乙個介面很簡單,只需要實現介面中宣告的方法即可,那我們實現了介面之後有啥用呢?
這個時候介面就能排上用場了,介面是一種抽象的型別。當你看到乙個介面型別的值時,你不知道它是什麼,唯一知道的是通過它的方法能做什麼。
type alipay struct
type wechat struct
func
(alipay)
pay(
)func
(wechat)
pay(
)type paymethod inte***ce
func
getmoney
(p paymethod)
func
main()
w := wechat
getmoney
(a)getmoney
(w)}
輸出結果為:
支付寶轉賬
type mover inte***ce
type dog struct
func
(d dog)
move()
func
main()
// 旺財是dog型別
x = wangcai // x可以接收dog型別
var fugui =
&dog
// 富貴是*dog型別
x = fugui // x可以接收*dog型別
x.move()
}
從上面的**中我們可以發現,使用值接收者實現介面之後,不管是dog
結構體還是結構體指標*dog
型別的變數都可以賦值給該介面變數。因為go
語言中有對指標型別變數求值的語法糖,dog
指標fugui
內部會自動求值*fugui
。
同樣的**我們再來測試一下使用指標接收者有什麼區別:
func
(d *dog)
move()
func
main()
// 旺財是dog型別
x = wangcai // x不可以接收dog型別
var fugui =
&dog
// 富貴是*dog型別
x = fugui // x可以接收*dog型別
}
此時實現mover
介面的是*dog
型別,所以不能給x
傳入dog
型別的wangcai
,此時x
只能儲存*dog
型別的值。
可以像匿名字段一樣,嵌入其他介面。目標型別方法集中,必須有包含嵌入介面方法在內的全部方法才算實現了該介面。
嵌入其他的介面型別,這就相當於將其宣告的方法集匯入。這就要求不能有重名方法,因為不支援過載。還有,不能嵌入自身或者迴圈嵌入,那會導致遞迴錯誤。
type stringer inte***ce
type tester inte***ce
type data struct
func
(*data)
test()
func
(data)
string()
string
func
main()
介面結構如下:
type iface struct
其中itab
儲存了執行期所需的相關型別資訊。
type itab struct
itab
裡面儲存了介面和實際物件的元資料,同時,itab
還用fun
陣列儲存了實際方法位址,從而實現在執行期間對目標方法的動態呼叫。
除此之外,介面還有乙個重要特徵:將物件賦值給介面時,會複製該物件。
在介面內部,只有當兩個指標(itab
和data
)都為nil
時,介面才等於nil
。
C語言學習 第七章函式
例7.4 include int isprime int isprime 函式的說明語句 main int isprime int a 定義isprime 函式 例7.5 include int isprime int isprime 函式的說明語句 void even int even 函式的說明...
第七章 介面
為什麼使用介面?什麼情況下使用介面?來看看下面這個例子 目前有許多檔案的壓縮格式,包括 zip rar cab tar等等。假如每種壓縮格式都建立乙個類,那麼每個壓縮實現都會有不同的方法簽名,無法提供標準的呼叫規範。雖然方法可以在基類宣告,並在子類實現,但是這樣會用掉唯一的基類機會 c 只支援單繼承...
第七章筆記
程序就是cpu未完成的工作 檢視程序的相關命令 ps a 關於當前環境的所有程序 x 與當前環境無關的所有程序 f 顯示程序從屬關係 e 顯示當前使用者環境中的所有程序 l 長列表顯示程序的詳細資訊 u 顯示程序的使用者資訊 ps ax o cpu,mem,user,group,comm,nice,...