Go語言基礎之介面

2021-10-03 11:05:54 字數 2640 閱讀 4595

介面(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)

)}

上述**不能通過編譯,因為*studentspeak方法只能由*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...