介面(inte***ce)定義了乙個物件的行為規範,只定義規範不實現,由具體的物件來實現規範的細節。
在go語言中介面(inte***ce)是一種型別,一種抽象的型別。
inte***ce是一組method的集合,是duck-type programming的一種體現。介面做的事情就像是定義乙個協議(規則),只要一台機器有洗衣服和甩乾的功能,我就稱它為洗衣機。不關心屬性(資料),只關心行為(方法)。
每個介面由數個方法組成,介面的定義格式如下:
type 介面型別名 inte***ce
其中:
介面名:使用type將介面定義為自定義的型別名。go語言的介面在命名時,一般會在單詞後面新增er,如有寫操作的介面叫writer,有字串功能的介面叫stringer等。介面名最好要能突出該介面的型別含義。
方法名:當方法名首字母是大寫且這個介面型別名首字母也是大寫時,這個方法可以被介面所在的包(package)之外的**訪問。
引數列表、返回值列表:引數列表和返回值列表中的引數變數名可以省略。
type animal inte***ce
type dog struct
type cat struct
func
(d *dog)
move()
func
(d *dog)
speak()
func
(c *cat)
move()
func
(c *cat)
speak()
乙個物件只要全部實現了介面中的方法,那麼就實現了這個介面。換句話說,介面就是乙個需要實現的方法列表。
那實現了介面有什麼用呢?
介面型別變數能夠儲存所有實現了該介面的例項。例如上例中。dog和cat都實現了介面animal,所以animal可以接受dog和cat兩種型別。
func
main()
an.move()
an.speak()
an=&dog
an.move()
an.speak()
}
貓動
貓叫狗浪
狗吠
type people inte***ce
type student struct
func
(stu *student)
speak
(think string
)(talk string
)else
return
}func
main()
think :=
"*****"
fmt.
println
(peo.
speak
(think)
)}
上述**不能通過編譯,因為*student
的speak
方法只能由*student
來呼叫。但是反過來結構體的方法可以通過指標直接呼叫,這屬於golang語法糖,編譯器會認為你是想通過指標解引用再呼叫其方法。
乙個型別可實現多個介面。多個型別可實現同一介面。並且乙個介面的方法,不一定需要由乙個型別完全實現,介面的方法可以通過在型別中嵌入其他型別或者結構體來實現。
介面與介面間可以通過巢狀創造出新的介面。
// sayer 介面
type sayer inte***ce
// mover 介面
type mover inte***ce
// 介面巢狀
type animal inte***ce
巢狀得到的介面的使用與普通介面一樣。
空介面是指沒有定義任何方法的介面。因此任何型別都實現了空介面。
空介面型別的變數可以儲存任意型別的變數。
空介面作為函式的引數
package main
import
"fmt"
// 空介面作為函式引數
func
show
(a inte***ce
)func
main()
)}
使用空介面實現可以儲存任意值的字典。
package main
import
"fmt"
type dog struct
type cat struct
func
main()
) an[
"姓名"]=
"小張"
an["年齡"]=
18 an[
"職業"]=
struct
an["dog"
]=dog
an["cat"
]=cat
fmt.
println
(an)
}
map[cat:{} dog:{} 姓名:小張 年齡:18 職業:{}] 13Go語言基礎之介面
本文是李文周的部落格go語言學習之路的目錄提要版,方便複習檢視使用,原文參見文章連線 介面 inte ce 定義了乙個物件的行為規範,只定義規範不實現,由具體的物件來實現規範的細節。在go語言中介面 inte ce 是一種型別,一種抽象的型別。inte ce是一組method的集合,是duck ty...
Go基礎之 介面
在go語言中,乙個類只要實現了介面要求的所有函式,我們就說這個類實現了該介面 inte ce型別可以定義一組方法,用來表示乙個物件的行為特徵,inte ce不能包含任何變數,介面是引用型別。舉個簡單的例子,乙個動物的介面,動物有吃的能力,有叫的能力,等等,這裡省略,假如動物就只有吃和叫的能力。pac...
Go 語言介面
go 語言提供了另外一種資料型別即介面,它把所有的具有共性的方法定義在一起,任何其他型別只要實現了這些方法就是實現了這個介面。例項 定義介面 type inte ce name inte ce 定義結構體 type struct name struct 實現介面方法 func struct name...