golang 方法與介面

2021-10-06 20:39:12 字數 2510 閱讀 5821

在程式語言中,方法與函式的概念來搞清楚。函式指的是乙個封裝的**塊,我們可以直接呼叫它,並且返回結果。而方法其實也是一種函式,只不過方法需要和某個物件繫結。golang並沒有類的概念,不過仍然有方法和介面這些概念。

方法接收者是乙個特殊引數,給函式指定了這個引數之後,函式就成為方法了。這個特性有點像kotlin和c#中的擴充套件方法,定義了帶有接收者的方法之後,接收者這個型別就好像定義了這個方法一樣,我們可以直接在該型別上呼叫方法。這在功能上,和物件導向的概念是很類似的。

例如下面這樣,定義了乙個汽車結構,然後定義了乙個接受者方法。然後就可以用物件導向的方式來呼叫這個方法了。

func method()

car.

beep()

}type car struct

func (car car

)beep()

接收者方法也有一些限制,這也是它和擴充套件方法之間的區別。接收者方法的接收者型別,必須和接收者方法定義在同乙個包中。所以很多非自定義的型別,以及基本型別都不能當做接收者的型別。當然也可以投機取巧,在自己的包中重新為這些型別取個名字即可。

//把基本型別重新定義一下,就可以當做接收者型別了

type mystring string

func (str mystring

)hello()

接收者的型別可以是指標,如果希望在接收者方法中修改接收者的屬性,就需要指標型別了。

package code

import

"fmt"

type linkedlist struct

func

newlinkedlist()

(*linkedlist)

}func

(c *linkedlist)

print()

// 是指標,因此會修改指標的值

func

(c *linkedlist)

changebyp()

// 不是在真正,不能修改指標的值

func

(c linkedlist)

changenop()

呼叫它

聽起來很奇怪,如果golang沒有型別,為什麼會有介面的概念?讓我們來看看golang如何解決這些問題。

在golang中,介面就是一組方法簽名的集合。下面就定義了乙個介面

type list inte***ce

;size()

int(value inte***ce

)}

在golang中,其實並沒有"實現介面"這一說法。在golang中介面是隱式實現的,也就是說我們不需要implements這些關鍵字。只要乙個型別的接收者方法和介面的定義的方法(函式名、引數、返回值)一致,golang就認為這個型別實現了該介面。

package

code

import

"errors"

type arraylist struct

}func (a *

arraylist

)get

(index int)(

inte***ce

, error)

if index >= a.size

return a.elementdata[index]

, nil

}func (a *

arraylist

)size()

intfunc (a *

arraylist

)(value inte***ce

)func newarraylist()

*arraylist

}

呼叫:

呼叫:

func

什麼方法都沒定義的介面就是空介面。根據golang的概念,空介面被任何型別隱式實現,所以空介面可以容納任何型別。

//空介面可以作為任何型別使用

type everything inte***ce

var e everything =

"123"

fmt.

println

(e)

golang中介面賦值與方法集

golang中的介面可以輕鬆實現c 中的多型,而且沒有繼承自同一父類的限制,感覺方便很多。但是在使用的時候,如果沒有理解,也可能會遇到 坑 比如 go語言實戰 中的乙個例子 package main import fmt type user struct type notifier inte ce ...

golang結構體與方法

type people inte ce type student struct func stu student speak think string talk string else return func main think speak fmt.println peo.speak think ...

golang 介面與nil的判等

在golang中,nil只能賦值給指標 channel func inte ce map或slice型別的變數。如果未遵循這個規則,則會引發panic。nil不能賦值給結構體,編譯時會報錯 package main import fmt type man struct var man man nil...